1.ATT&CK实战| VulnStack红队(五)
2.Jvm-Sandbox原理分析-Sandbox的对应的源启动-01
3.用 Rust 编写的 GNU Coreutils 替代品取得多项进展
ATT&CK实战| VulnStack红队(五)
红日安全团队新项目启程,聚焦于深入理解漏洞与自学能力提升,源码我们自主搭建靶场并编写系列攻防文档。对应的源文档需包含信息收集、源码漏洞挖掘(至少两种Web漏洞、对应的源主机或中间件漏洞)、源码吃鸡画质源码代码审计(审计一种相关漏洞)、对应的源主机信息收集、源码提权等内容。对应的源项目最后提交包括靶场、源码工作点(WP)、对应的源设计题目思路图。源码Web小组现在招募,对应的源欢迎挑战自我、源码友信源码自学能力突出的对应的源伙伴加入。
环境设置:Win7 +phpstudy+thinkphp(5.0.);IP:...、...、...;攻击机IP:...。
外网渗透策略:访问...,目录扫描发现robots.txt和add.php后门。利用爆破工具尝试入侵,也可利用RCE漏洞,通过输入错误页面查看thinkphp版本号并找到对应的漏洞利用代码。
RCE执行命令示例:.../?...\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami。
代码审计分析:发现RCE漏洞payload、5.0.x补丁位置及漏洞源码分析,通过URL路由检测、聊天服务源码parseUrl函数和routeCheck函数流程追踪,理解漏洞触发原理。
漏洞利用详细步骤:1. 漏洞POC与框架URL处理相关,跟踪到URL路由检测函数;2. $dispatch为空,执行routeCheck函数,路径变量$path为index/think\app/invokefunction;3. 结果为false,执行parseUrl函数;4. parseUrl函数转换路径,并传入routeCheck函数;5. 通过routeCheck执行系统命令。
内网渗透流程:1. 主机信息收集,通过arp信息发现同网段主机;2. 域控IP识别,ping域名sun.com获取域控IP;3. 横向移动,使用cs工具攻击域控,创建监听器、图片解析源码生成木马并执行;4. 提权,利用cs方法获得系统权限,读取域管理员密码;5. 扫描内网,基于IPC共享登录主机;6. 通过已经上线的主机作为监听器,让无法出网的dc主机上线。
项目总结:红日安全团队新项目旨在深入学习Web安全漏洞,提供一个自主搭建的靶场环境,编写攻防文档,同时招募喜欢挑战自我、自学能力强的伙伴加入。项目涵盖从外网渗透到内网横向移动的全过程,包含代码审计与提权等高级技术,旨在提升成员的抢得快源码实战能力。
更多安全课程资源:访问qiyuanxuetang.net/cours...
Jvm-Sandbox原理分析-Sandbox的启动-
Jvm-Sandbox的启动(一):sandbox.sh脚本分析
Sandbox的启动是通过其内置的shell脚本 sandbox.sh 开始执行的,一切的开始皆可从该脚本中探寻出结果。脚本有一定的代码量,大概有+行,这里将该脚本分为如下几个部分进行讲解:
1、变量定义过程这个过程首先预定义了接下来即将使用的一些变量。代码如下:
# 定义sandbox的home目录,并为其赋值 typeset SANDBOX_HOME_DIR [[ -z ${ SANDBOX_HOME_DIR} ]] && SANDBOX_HOME_DIR=${ PWD}/..# 定义 SANDBOX_USER,并为其赋值 typeset SANDBOX_USER=${ USER} [[ -z ${ SANDBOX_USER} ]] && SANDBOX_USER=$(whoami)# 定义 SANDBOX_SERVER_NETWORK typeset SANDBOX_SERVER_NETWORK# 定义lib目录,这个目录下主要存放jar包 typeset SANDBOX_LIB_DIR=${ SANDBOX_HOME_DIR}/lib# 定义 SANDBOX_TOKEN_FILE typeset SANDBOX_TOKEN_FILE="${ HOME}/.sandbox.token"# 定义JVM参数 SANDBOX_JVM_OPS typeset SANDBOX_JVM_OPS="-XmsM -XmxM -Xnoclassgc -ea"# 定义目标JVM的进程号,后面的agent主要attach到该JVM进程上 typeset TARGET_JVM_PID# 定义目标机器IP以及默认机器IP typeset TARGET_SERVER_IP typeset DEFAULT_TARGET_SERVER_IP="0.0.0.0"# 定义目标进程端口 typeset TARGET_SERVER_PORT# 定义名称空间 typeset TARGET_NAMESPACE typeset DEFAULT_NAMESPACE="default"注释和变量命名已经描绘的非常清楚了,在看后面代码遇到忘记了的变量可以到这里来回顾下。
这里为其中一些变量补充说明:
SANDBOX_HOME_DIR:shell脚本中,-z表示检测紧跟的字符串长度是否为0,如果为0返回true。这里使用短路与,如果 ${ SANDBOX_HOME_DIR} 为0,则使用 ${ PWD}/.. 的目录作为sandbox的home目录。这种方式表示优先使用环境变量 SANDBOX_HOME_DIR,如果未定义环境变量SANDBOX_HOME_DIR,则使用当前目录。
SANDBOX_TOKEN_FILE:这个文件主要存放了sandbox attach记录,包括attach进程的host:port。
TARGET_SERVER_IP:一般情况下,我们都是将整个工程打包后上传至目标机器,然后在目标机器上执行该shell脚本,因此默认机器IP一般为localhost即可。
2、执行入口执行入口就比较简单了,就一行代码,其中${ @}会保存我们传递给该shell脚本的所有参数:
main "${ @}"比方说,我们以如下命令启动脚本,则${ @} 就包含了-p 这个参数
./sandbox.sh -p 、main函数main函数是该脚本的重要方法,也是脚本的执行入口,它主要完成了以下几件事:
其代码如下所示:
function main() { # 遍历脚本参数 while getopts "hp:vFfRu:a:A:d:m:I:P:ClSn:X" ARG; do case ${ ARG} in h) # 帮助手册函数,大家可以自行翻阅源码查看 usage exit ;; # 赋值PID p) TARGET_JVM_PID=${ OPTARG} ;; v) OP_VERSION=1 ;; l) OP_MODULE_LIST=1 ;; R) OP_MODULE_RESET=1 ;; F) OP_MODULE_FORCE_FLUSH=1 ;; f) OP_MODULE_FLUSH=1 ;; u) OP_MODULE_UNLOAD=1 ARG_MODULE_UNLOAD=${ OPTARG} ;; a) OP_MODULE_ACTIVE=1 ARG_MODULE_ACTIVE=${ OPTARG} ;; A) OP_MODULE_FROZEN=1 ARG_MODULE_FROZEN=${ OPTARG} ;; d) OP_DEBUG=1 ARG_DEBUG=${ OPTARG} ;; m) OP_MODULE_DETAIL=1 ARG_MODULE_DETAIL=${ OPTARG} ;; # 赋值IP I) TARGET_SERVER_IP=${ OPTARG} ;; # 赋值PORT P) TARGET_SERVER_PORT=${ OPTARG} ;; C) OP_CONNECT_ONLY=1 ;; S) OP_SHUTDOWN=1 ;; n) OP_NAMESPACE=1 ARG_NAMESPACE=${ OPTARG} ;; X) set -x ;; ?) usage exit_on_err 1 ;; esac done # 重置环境 reset_for_env # 校验权限 check_permission# 根据不同的参数,进行相应处理 # 如果没有指定IP,则使用默认值 [ -z "${ TARGET_SERVER_IP}" ] && TARGET_SERVER_IP="${ DEFAULT_TARGET_SERVER_IP}"# 如果没有指定port,使用默认值 [ -z "${ TARGET_SERVER_PORT}" ] && TARGET_SERVER_PORT=0# reset NAMESPACE [[ ${ OP_NAMESPACE} ]] && TARGET_NAMESPACE=${ ARG_NAMESPACE} [[ -z ${ TARGET_NAMESPACE} ]] && TARGET_NAMESPACE=${ DEFAULT_NAMESPACE}if [[ ${ OP_CONNECT_ONLY} ]]; then [[ 0 -eq ${ TARGET_SERVER_PORT} ]] && exit_on_err 1 "server appoint PORT (-P) was missing" SANDBOX_SERVER_NETWORK="${ TARGET_SERVER_IP};${ TARGET_SERVER_PORT}" else # -p was missing [[ -z ${ TARGET_JVM_PID} ]] && exit_on_err 1 "PID (-p) was missing." # attach jvm的核心方法 attach_jvm fi# -v show version [[ -n ${ OP_VERSION} ]] && sandbox_curl_with_exit "sandbox-info/version"# -l list loaded modules [[ -n ${ OP_MODULE_LIST} ]] && sandbox_curl_with_exit "sandbox-module-mgr/list"# -F force flush module [[ -n ${ OP_MODULE_FORCE_FLUSH} ]] && sandbox_curl_with_exit "sandbox-module-mgr/flush" "&force=true"# -f flush module [[ -n ${ OP_MODULE_FLUSH} ]] && sandbox_curl_with_exit "sandbox-module-mgr/flush" "&force=false"# -R reset sandbox [[ -n ${ OP_MODULE_RESET} ]] && sandbox_curl_with_exit "sandbox-module-mgr/reset"# -u unload module [[ -n ${ OP_MODULE_UNLOAD} ]] && sandbox_curl_with_exit "sandbox-module-mgr/unload" "&action=unload&ids=${ ARG_MODULE_UNLOAD}"# -a active module [[ -n ${ OP_MODULE_ACTIVE} ]] && sandbox_curl_with_exit "sandbox-module-mgr/active" "&ids=${ ARG_MODULE_ACTIVE}"# -A frozen module [[ -n ${ OP_MODULE_FROZEN} ]] && sandbox_curl_with_exit "sandbox-module-mgr/frozen" "&ids=${ ARG_MODULE_FROZEN}"# -m module detail [[ -n ${ OP_MODULE_DETAIL} ]] && sandbox_curl_with_exit "sandbox-module-mgr/detail" "&id=${ ARG_MODULE_DETAIL}"# -S shutdown [[ -n ${ OP_SHUTDOWN} ]] && sandbox_curl_with_exit "sandbox-control/shutdown"# -d debug if [[ -n ${ OP_DEBUG} ]]; then sandbox_debug_curl "module//post/用 Rust 编写的 GNU Coreutils 替代品取得多项进展
在Linux系统和其他平台中,GNU Coreutils提供了一系列常用且重要的命令行工具,涵盖了诸如cat、ls、rm、chmod、mkdir、wc、whoami等命令。然而,随着行业在安全敏感代码转换中日益采用内存安全性的现代编程语言如Rust,Sylvestre Ledru和其团队致力于开发基于Rust的GNU Coreutils替代品——Rust Coreutils,旨在全面清除C语言代码,采用主打内存安全性和安全性的Rust语言。
近一年来,Rust Coreutils取得了显著进展,现已能在基本的Debian系统上运行,并在提升GNU Coreutils兼容性方面持续努力。根据国外媒体phoronix的报道,相较于GNU包中的命令,如head、cut等常见命令,Rust Coreutils的性能表现更为出色,显着提升。
尽管如此,Rust Coreutils仍面临着与上游GNU命令兼容性缩小的挑战,目前尚有待实现的二进制文件之一是stty。开发团队不仅专注于优化和兼容性工作,还致力于使Debian和Ubuntu系统能更加轻松地切换到Rust Coreutils。了解该项目的最新状态和源代码可访问Sylvestre Ledru的博客以及GitHub平台。