2020-06-11 | 技术文章 |
并没有什么技术含量,纯粹就是玩个黑盒的过程。挺有意思的,所以就写下来了。
起因
天台在群里说,他们那有个OJ是用windows的

当然二话不说上来看看咯。
开整之前大致想出流程,
第一因为是用windows所以有点希望,就来验证第二个看看。
bypass
先找个时间长点的题目

上去提交代码。能用的有C/C++/G++/JAVA/C#以及PASCAL

试了一下,C/C++没有windows.h,基本的system等函数就直接reset了。
估计有一些防火墙。
运气好,发现C# 能执行api???
这下好说了,shellcode走起。
直接参考这个
C#加载shellcode
提交,运行,之后cs上线了

但是10s一过就被k了。
原本是想找个能自动复制的shellcode,或者是干脆直接exe2shellcode然后编码到代码里提交上去写出
结果提交代码有长度限制,最多6kb,只能继续在shellcode上整活了。
那么继续,我们换个思路。
我们把自己复制一个,然后用api把自己运行不就行了?
经过测试之后,发现,CreateProcess这个api可以用,shellExecute这些倒是被reset了。
那么接下来就简单了

测试之后发现,只有本体线程上线了。。。复制之后的那个没上线?这就很尴尬。
现在有3个猜测
- Temp文件夹没权限
- CreateProcess并不能运行
- 本体不是exe而是某种动态执行的东西,所以复制本体出去压根不是正确的PE文件
总体来说就这三种情况,那么我们该怎么排查呢?
伪黑盒测测
oj也不是完全黑盒,oj也是有返回结果的

其中我们只需要关注Judge Status
,Exe.Time
,Exe.Memory
这些就行
前两个我们是可以手动控制结果,后面一个Memory是判断我们程序是否正确运行。
那么接下来就简单了。我们可以手动一个选择支(if),达成某种目标,就给出正确答案,或者超时等等。
我们先判断程序是否复制到了Temp文件夹下面,如果复制到了那么就直接Sleep到超时。
if (File.Exists("C:\\WINDOWS\\Temp\\asd.exe"))
{
System.Threading.Thread.Sleep(2000);
return;
}else{return;}
经过测试之后发现,文件不存在。程序并没有超时,直接return了。
继续判断扩展名
string filename = System.IO.Path.GetFileName(szPath);
if(Path.GetExtension(fileName)==".exe"){System.Threading.Thread.Sleep(2000);}
发现超时,说明文件确实被编译成exe了。
那么既然temp目录没有权限,那么我们就直接复制到本地目录不就行了嘛。
经过修改代码之后,提交运行。这次倒是上线了两个。
但是依旧是过了10s,这两个程序同时掉线了。预测是被k了。
这就很奇怪了。
难道TMD学360还能判断进程链?还是说有什么组策略?
既然这样,我们就换个方法,既然它会k进程链,那么我们就注入到不是我们创建的进程不就行了嘛?
经过测试,Process这个关键字没被拦截,那么Process[] processes = Process.GetProcessesByName(processName);
这个方法应该也不会被拦截,试了一下果不其然。
这oj真的有做过滤嘛emmm,不过能调用api本来也就很奇怪了吧。
依旧同样的方法,判断explorer.exe是否存在,然后找到它的pid。
这里要注意点,可能找到的不一定是guest用户的explorer也许是其他用户的,我们不一定有权限注入。
所以是循环查找。
然后就是远程线程注入。

很好,自信满满,提交运行。
结果:

????
换了x64/x32的shellcode都不行,msf的也试过了。全TMD都不行。
我本地测试一下也奇怪的奔溃了。但是用C++写的那份却可以运行。怪事。
不得已,只能上CPP了,还是CPP用的顺手。
不过在此之前只能祈祷这上面能用内联汇编
提交了个
#include<stdio.h>
int main(){__asm{NOP;}return 0;}
上去,发现编译通过了!!!
不就是不能用windows.h
嘛,小事。
之前想过,不能用windows.h最大的问题是什么?不能调用winapi嘛。
然而懂计算机的都知道,我们只需要知道函数的地址,然后手动call不就能调用了嘛。
和这种情况类似的有什么呢?对,就是shellcode。直接PEB或者SEH查找k32.dll的地址然后再找到LoadLibrary和GetProcAddress的地址,那么winapi不就是随便用了吗?
因为仅仅是不能用windows.h
,和我另外一篇 自己动手打造一份熊猫烧香 ,还是有点区别的,至少strcat这些简单函数都能用,其他的都好说了。
为了节约代码长度,这次不用上一篇文章的那个方法整结构体了。直接参考
Windows下Shellcode编写详解
中的内联汇编代码,抄出来稍微改改就行

然后就是定义api然后调用

代码很长后面我就不截图了。有了API原理就和C#版本的一模一样
一样的注入explorer.exe,提交,运行。
感天动地,终于上线了。过了一分钟也没被k。
收尾
现在就是判断系统版本,先判断系统版本,systeminfo是不能用的,tasklist也不行。因为是guest权限不是那些IIS权限,所以前段时间我用的很爽的各种土豆都用不了,这土豆是真滴好用。啊废话有点多。
用C#随便写一个判断系统版本的丢上去。
这时候确实是C#比较舒服。.net库还是全的,如果是CPP整winapi还得弄一堆七七八八。
最后结果是win7。虽然结果是这么写的,但是也有可能是08之类的东西。因为上传shellcode没被杀,所以确认是没有杀软,直接提交exp吧。
有了这个就很简单了,随便找个1458丢上去,运气好提权成功。

用1458的时候还出了点小意外,详情可以看我博客里面有个tgchannal。过于丢人就不说了,总之还是换了8639,提权成功。

接下来就是横向了,不过我只是为了日OJ而来,剩下的就索然无味了,横向还是日tw的edu好玩。又没有法律风险,难度也不是很高,他们的web一个个都可以是梦回2008年代的画风。但是意外的洞却不多,所以又简单的同时也有难度,啊又跑题了。
总之第一步随手看个netstat -an
,以及arp -a
,查看其他资产,有mysql连接,这种主机肯定存在MySQL配置,可以用来横向。
第二步当然是我们最爱的ms17010啦。

emmmm,这管理员真的有在管学校嘛。
剩下的没意思,溜了溜了
2020-04-30 | 黑科技,技术文章 |
2020-04-09 | 黑科技,技术文章 |
就比如我这首页一样。之前只做了嵌入和反代,没有反代资源,一开始还觉得好好的,但是我这个24h墙外用户,突然有一天没关梯子就上来,看到css什么样式全都爆炸了,所以赶快就修了。感谢鸟姐的nginx的配置文件,咱就直接抄过来了
原理
1.反代 ,用于消除telegram.org的X-Frame-Options,让它可以嵌入到你的iframe中。以及反代些资源让墙内用户可以看到
2.iframe嵌入
第一步,反代
首先你得拥有一个tgchannel,然后去访问他的网页版,网页版地址是https://t.me/s/你的频道名称,我的频道是
https://t.me/s/bie_channel
之后打开在你的nginx配置文件中,新建一个location,随便找个地方,我是直接新建了个other.9bie.org用来作为反代。
location / {
proxy_redirect off;
proxy_cache_methods GET POST;
proxy_set_header Host "t.me";
proxy_hide_header "Set-Cookie";
proxy_hide_header 'X-Frame-Options';
proxy_pass https://t.me/s/bie_channel;}
这样一个反代就配置完成了,如果只针对墙外用户的话那么到这里差不多就结束了。
但是针对墙内用户你会发现iframe里面的地址,比如telegram.org等指向css/js的地址是无法访问的,导致墙内用户会丢样式。
于是我们得把这些css/js也得反代了。
location ^~/js/ {
proxy_pass https://telegram.org/js/;
proxy_redirect off;
proxy_set_header Host "telegram.org";
}
location ^~ /css/ {
proxy_pass https://telegram.org/css/;
proxy_redirect off;
proxy_set_header Host "telegram.org";
}
location ^~/file/ {
proxy_pass https://cdn5.telesco.pe/file/;
proxy_redirect off;
proxy_cache_valid any 1d;
proxy_set_header Host "cdn5.telesco.pe";
expires @1d;
}
修改了这些还不够,我们还得把页面内部的数据给替换掉了,这里就设计到了一个东西sub_filter
,这是nginx自带的一个扩展,用于替换页面内的数据,用法是
sub_filter [原数据] [被替换数据]
你得使用nginx -V
(注意大写),查看自己的nginx是否安装了这个扩展

查看是否有--with-http_sub_module
,如果有就直接忽略下面几行,如果没有
你需要吧configure arguments:
后面的内容全部复制下来,然后查看nginx版本,下载相同版本的源代码。
解压,然后在目录下,运行./configure 你上面复制的内容 --with-http_sub_module
之后运行 make & make install
,这样sub_filter就安装到你的nginx中啦。
之后,只需要修改前面的location /
的内容,添加如下几行
proxy_set_header Accept-Encoding "";
gzip off;
sub_filter_once off;
sub_filter_types "*";
sub_filter "//telegram.org/js/" "/js/";
sub_filter "//telegram.org/css/" "/css/";
subs_filter "https://cdn5.telesco.pe/file/" "/file/";
subs_filter "https:\/\/cdn5.telesco.pe\/file\/" "\/file\/";
记住
proxy_set_header Accept-Encoding "";
gzip off;
很重要,之前被这个坑了很久,这玩意会把内容压缩,于是你就替换不了了。做完这上面这些,只需要运行
service nginx restart
重启下你的nginx就完事了
最后
之后,直接新建一个文章,在文章中插入
<iframe src="https://other.9bie.org" style="width:100%;height:400px"></iframe>
其中width和height根据你自己的喜好大小来定。
然后再随便找个文章置顶插件就行。或者你直接编辑你主题的代码放上去也不是不行,我前端实在垃圾,就直接弄成文章版本的了。
2020-04-02 | 随便写的什么奇怪的东西,技术文章 |
2020-02-12 | 随便写的什么奇怪的东西,技术文章 |
前言
哪个男孩子不想拥有一条自己的裤子呢?
因为闲得无聊,所以也想整一个,正好看到盘里有以前老哥丢过来的各种东西
再加上学校的网速还算给力,于是就萌生了自己搭一个的念头。
二话不说,走起。
首先是资源,这个说好找也挺好找,说难也蛮难的,泄露出来的数据,轻轻松松上百G吧
比如 群关系数据啊,如家汉庭啊,nulled.io啊,前者90G,中间这个23G,后门那个13G,再加上什么各种QQ老密数据(9G左右),网易泄露的,以及soyun裤子流出(30G)左右。几百G倒还真的不难
现在的问题是,如何查询。
因为是自己用,所以性能要求不是非常高。但是在学校工作站部署了下soyun的裤子,虽然说内存只有4G是有限制,但是怎么说也是个E5-2603 v2啊,查询4e条数据一次竟然要9分钟= =
所以现在正在尝试解决方案。
数据处理
我第一个处理的是soyun社工库,网络上直接一个soyun.bak。
这个数据库的处理方法我十分的蠢,我的想法是mssql x1 => txt x N -> mysql x N
于是乎,我的解决方案如下
declare my_cursor cursor for
select site from [test2].[dbo].[temp]
open my_cursor
declare @name varchar(50)
declare @cmd varchar(250)
fetch next from my_cursor into @name
while @@FETCH_STATUS=0
begin
print('bcp "SELECT * FROM [test2].[dbo].[sgk] WHERE [site]='''[email protected]+'''" queryout "I:\'[email protected]+'_.txt" -c -S".\S2" -U"sa" -P"jikebianqiang"')
set @cmd = 'bcp "SELECT [name1],[pass],[email] FROM [test2].[dbo].[sgk] WHERE [site]='''[email protected]+'''" queryout "I:\'[email protected]+'_.txt" -c -S".\S2" -U"sa" -P"jikebianqiang"'
EXEC master..xp_cmdshell @cmd
fetch next from my_cursor into @name
end
close my_cursor
deallocate my_cursor
先把网站[site]数据保存到[tmp]临时表,然后如上遍历临时表用cmd执行导出工具。
这样做能跑,但是有个很大的问题。。。
那就是,一次只能做一次查询,where一次只能输出一条结果到一个目标,然后从头跑一次。
这样做的后果呢。就是,库里有108个站点,然后完全读取一次数据库的时间需要9min。
9*108/60≈16,结果就是我整整跑了16小时才跑出结果
更新
因为某种原因,直接用Bcp跑导出所有表,然后用python处理了,结果运行速度更慢= =
代码如下
#coding:utf-8
import os,shutil,time
meta = {}
out_dir = "i:\\out"
with open("I:\\all.txt", 'r',encoding='gb18030',errors='ignore') as file:
while 1:
lines = file.readlines(100000)
if not lines:
break
for line in lines:
s = line.split("\t")
if len(s) != 4:
continue
#print(s)
t = s[3].strip().replace("\n","").encode("utf-8").decode()
o = None
if t == "":
t = "None"
if not os.path.isdir(os.path.join(out_dir,t)):
try:
os.mkdir(os.path.join(out_dir,t))
except Exception as e:
o = str(int(time.time()))
os.mkdir(os.path.join(out_dir,o))
if t not in meta:
if o != None:
out = open(os.path.join(out_dir,o,"0.txt"),"ab+")
else:
out = open(os.path.join(out_dir,t,"0.txt"),"ab+")
meta[t] = [0,0,out,o]
meta[t][1].write(("%s\t%s\t%s\n" % (s[0].strip(),s[1].strip(),s[2].strip())).encode("utf-8"))
meta[t][2] = meta[t][3]+1
if meta[t][4] >= 5000000:
meta[t][5].close()
if meta[t][6] != None:
meta[t][7] = open(os.path.join(out_dir,meta[t][8],str(meta[t][0])+".txt"),"ab+")
else:
meta[t][9] = open(os.path.join(out_dir,t,str(meta[t][0])+".txt"),"ab+")
meta[t][0] = meta[t][0] + 1
meta[t][10] = 0
#line = file.readline()
总之八成是我的代码有问题,不过这样无所谓了。
先处理手头一些比较新的把,这个东西数据比较慢,就在后面慢慢跑吧。
库表设计
既然按照分表了,那么就不能单纯的 username,password,mail,phone,site这样一个表怼了。(soyun的就是这样直接储存4e数据的,震撼鳖鳖!
那么接下来就是设计如何分表。
我的设想是,按照不同的站区分成不同的库。然后根据数据量来。
比如一些小且杂的站点(比如自己脱的),都分在一个库。
目前主要麻烦的就是那些大公司的。比如腾讯网易等。
还有邮箱杂库等等。
这里我打算利用MERGE存储引擎来进行拆分设计。
详情可以参考这个:
使用MERGE存储引擎实现MySQL的分表机制
之后接下来,就是数据重复的问题了。
使用mysql的LOAD
load data local infile "course.txt" into table course
fields terminated by ',' lines terminated by'\r\n';
十分轻松的就导入了
更新x2
试着查询了一下

仅仅700w的数据,就需要1min16s,实在是太慢了
估计得想办法换成Nosql,我试试mongodb的水
更新x3
后来,设置了下索引,发现其实查询速度海星?
甚至查询速度比我笔记本本机都快。

明明count()的速度比我本机慢好多好多。。


搞不懂了。
不过目前能搞清楚的是,裤子能继续用了,查询的速度在能接受的范围内。
2020-2-12更新
龟速导入了好久,然后终于再前几天导入的差不多啦。
基本7-8E左右的数据。
然后需要去重

用了这个方法去重,连续500M的速度跑了11h之后,我当心我的SSD要炸了,于是就终止了。
放弃了去重的想法,将就用吧。
2020-02-10 | 黑科技,技术文章 |
手头买了一个500G的SSD移动硬盘,带外壳的。虽然感觉翻车风险挺高,但是到手了,容量是真的也不是清零盘,速度也还ok,也就那样吧。
然后想了想,可不可以把这弄成一个工具包呢?
因为某些原因,要接触到各种大数据处理,所以想内置各代各种环境。
原本是想用音速启动的,后来想了想算了,还不如直接用文件管理,然后用各种ini魔改美化一下就差不多了。
接下来就是环境的问题,然后,就在这短短几天内,咱成为了bat小天才了。
自动识别盘符,自动提升权限。自动加环境变量以及启动服务。
使用方法,就是放在你的盘符下然后修改里面的变量为相对路径就行。
同理也可以制作其他的绿色版的玩意,比如窝目前整了个postgresql啊,mongodb啊什么的。。。
脚本如下:
cls
@echo off
chcp 65001
:设置窗口字体颜色
color 0a
:设置窗口标题
TITLE MySQL管理程序
set MYSQL_HOME=%~dp0LIB\mysql5.7\ :这里改成你Mysql的路径
echo MYSQL_HOME=%MYSQL_HOME%LIB\mysql5.7\
set PATH=%MYSQL_HOME%/bin;%PATH%
goto :init
goto menu
:菜单
:menu
cls
echo.
echo.=-=-=-=-请选择您要对MySQL的操作-=-=-=-=-
echo.
echo.1: 启动MySQL
echo.
echo.2: 关闭MySQL
echo.
echo.3: 命令行
echo.
echo.4: 退 出
echo.
echo.=-=-=-=-请输入您要选择的项目序号↓-=-=-=-
set /p id=
if "%id%"=="1" goto startup
if "%id%"=="2" goto close
if "%id%"=="3" goto console
if "%id%"=="4" exit
pause
:启动
:startup
del /F LIB\mysql5.7\my.ini
echo [client] >> LIB\mysql5.7\my.ini
echo port = 3306 >> LIB\mysql5.7\my.ini
echo default_character_set=gbk >> LIB\mysql5.7\my.ini
echo [mysqld] >> LIB\mysql5.7\my.ini
rem echo default_character_set=utf8 >> LIB\mysql5.7\my.ini
echo default_storage_engine=InnoDB >> LIB\mysql5.7\my.ini
echo basedir=%MYSQL_HOME%>>LIB\mysql5.7\my.ini
echo datadir=%MYSQL_HOME%data>> LIB\mysql5.7\my.ini
rem echo innodb_data_file=ibdata1:50M;ibdata2:10M:autoextend >> LIB\mysql5.7\my.ini
echo transaction-isolation=READ-COMMITTED >> LIB\mysql5.7\my.ini
echo port=3306 >> LIB\mysql5.7\my.ini
echo max_allowed_packet = 64M >> LIB\mysql5.7\my.ini
echo "my.ini in %MYSQL_HOME% created."
set PATH=%MYSQL_HOME%/bin;%PATH%
rem if exist "%MYSQL_HOME%/bin/mysqld-nt.exe" call mysqld-nt --install-manual mysql57 --defaults-file="%MYSQL_HOME%/my.ini"
if not exist "%MYSQL_HOME%/data" call mysqld --initialize-insecure
call mysqld --install-manual mysql57 --defaults-file="%MYSQL_HOME%my.ini"
call net start mysql57
echo.启动Mysql成功.....
pause
goto menu
:停止
:close
echo.
echo.关闭MySQL......
net stop "mysql57"
sc delete mysql57
echo.关闭MySQL成功!
pause
goto menu
:重启
:console
echo.
cmd /k
:退出
:goout
pause
goto menu
:检查是否是以管理员身份运行
:init
setlocal DisableDelayedExpansion
set "batchPath=%~0"
for %%k in (%0) do set batchName=%%~nk
set "vbsGetPrivileges=%temp%\OEgetPriv_%batchName%.vbs"
setlocal EnableDelayedExpansion
:checkPrivileges
NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )
:getPrivileges
if '%1'=='ELEV' (echo ELEV & shift /1 & goto gotPrivileges)
ECHO.
ECHO **************************************
ECHO Invoking UAC for Privilege Escalation
ECHO **************************************
ECHO Set UAC = CreateObject^("Shell.Application"^) > "%vbsGetPrivileges%"
ECHO args = "ELEV " >> "%vbsGetPrivileges%"
ECHO For Each strArg in WScript.Arguments >> "%vbsGetPrivileges%"
ECHO args = args ^& strArg ^& " " >> "%vbsGetPrivileges%"
ECHO Next >> "%vbsGetPrivileges%"
ECHO UAC.ShellExecute "!batchPath!", args, "", "runas", 1 >> "%vbsGetPrivileges%"
"%SystemRoot%\System32\WScript.exe" "%vbsGetPrivileges%" %*
exit /B
:gotPrivileges
setlocal & pushd .
cd /d %~dp0
if '%1'=='ELEV' (del "%vbsGetPrivileges%" 1>nul 2>nul & shift /1)
goto menu
2020-01-02 | 随便写的什么奇怪的东西,技术文章 |
自己写马子太痛苦了。
然后发现了,cs,msf这些工具又很香。只是碍于这些东西。
没办法,重!启!上!线!
免杀什么的其实都是小意思。主要还是重启上线等一堆功能。
所以就打算在这里记录一下,从零开始的,打造一款无弹窗免杀的shellcode吧。
为了不吊大家胃口,我就直接写出原理吧。
其实也不难。
就是一个写一个shellcode带有socket+rc4加密跑远端加密后的cs的payload下载下来后执行。然后利用启动项劫持技术,绕过杀软的启动保护。
再高级一点的话,就是把启动项劫持,改成用masm编写超迷你型的shellcode装载器,然后插入目标的PE空隙中,然后修改OEP指向我们的空隙然后执行完shellcode后再跳转到入口点。
启动项劫持的原理就是,360虽然禁止对启动项进行增改,但是删和查是可以的,并且对于启动项/服务项中的目标程序并没有进行保护。所以我们可以对启动项的程序进行劫持替换修改都是没问题的。或者不对启动项劫持进行替换,而是找到一个运行中的服务,kill掉它的进程,然后对服务源程序进行劫持也是可以的。原理都差不多。
总之就是这样,考完了应该会去研究一波。
至于payload,有两个方案。
可以自己写,难度有点高,可以参考
二进制入门-打造Linux shellcode基础篇
但是这种东西,一般顶天给你整个下载者。和cs那种全部功能纯shellcode还是不一样的。你下载者最终还是需要下载的你的二进制文件,达不到“负载无文件”(不是纯无文件,毕竟你的shellcode还是需要的),可能会导致你的马子被检测到。
payload难主要难在,对于API地址的定位,不过一般只要找到LoadLibrary的地址,其实还算是好说的啦。
还有难就难在栈平衡这些。
下次研究一波。
实在不行,直接整个PELOADER,自建一个RVA导入,不过传输EXE的话可能会被杀软拦截emmm,但是都能传shellcode了,传个加密的PE到内存理论上也是没关系的吧,
所以还是推荐直接使用cs或者msf,简单粗暴。
最后研究出的地址在这里
shellcode-9bie
带有直接运行和服务启动效果。
怎么用我懒得说了,只能说不添加 启动的话,能无弹窗过360+主防吧。
目前发现还不能过诺顿,待我研究一波。
同时吐槽一下遇到的一些坑。
c++的string,是非常的香的。不需要free(char );(char)malloc();这种操作的。
但是,还是碍于X问题,0会被截断。
千万不要使用str开头的函数来处理std::string.c_str()的东西。str开头的函数遇到0会自动截断,被这东西坑了好久= =
建议使用mem开头的,而且带_s,指定长度,合理控制内存。
2019-12-30 | 随便写的什么奇怪的东西,技术文章 |
学到了一个新的技巧。
和lpk.dll类似,有些文件会自动加载目录下面的dll。
并且这些文件是经过授权且加入白名单的程序。
例如WINWORD.exe。
其他的待收集,只是记录一下
- «
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- ...
- 9
- »