
Explorateur de trafic HTTP malveillant

CapTipper v0.3 : http://www.omriher.com/2015/08/captipper-v03-is-out.html
CapTipper v0.2 : http://www.omriher.com/2015/03/captipper-02-released.html
CapTipper v0.1 : http://www.omriher.com/2015/01/captipper-malicious-http-traffic.html
CapTipper est un outil Python permettant d’analyser, explorer et faire revivre du trafic HTTP malveillant.
CapTipper met en place un serveur web qui agit exactement comme le serveur dans le fichier PCAP,
et contient des outils internes, avec une console interactive puissante, pour l’analyse et l’inspection des hôtes, objets et conversations trouvés.
L’outil offre au chercheur en sécurité un accès facile aux fichiers et une compréhension du flux réseau,
et est utile lors de la recherche d’exploits, préconditions, versions, obfuscations, plugins et shellcodes.
Alimenter CapTipper avec une capture de trafic « drive-by » (par exemple d’un kit d’exploitation) affiche à l’utilisateur les URI des requêtes envoyées et les métadonnées des réponses.
L’utilisateur peut alors naviguer vers http://127.0.0.1/[host]/[URI] et recevoir la réponse dans le navigateur.
De plus, un shell interactif est lancé pour une investigation plus approfondie grâce à diverses commandes telles que : hosts, hexdump, info, ungzip, body, client, dump et bien d’autres…
Documentation : http://captipper.readthedocs.org
Mise à jour du 02-Oct-2020 :
CapTipper prend désormais en charge Python3 et se trouve dans la branche suivante : https://github.com/omriher/CapTipper/tree/python3_support

Usage: ./CapTipper.py <PCAP_file> [-p] [web_server_port=80]
Analysons le PCAP d'infection drive-by Nuclear EK suivant [2014-11-06-Nuclear-EK-traffic.pcap](http://malware-traffic-analysis.net/2014/11/06/2014-11-06-Nuclear-EK-traffic.pcap.zip)```sh
C:\CapTipper> CapTipper.py "C:\NuclearFiles\2014-11-06-Nuclear-EK-traffic.pcap"
CapTipper v0.1 - Malicious HTTP traffic explorer tool
Copyright 2015 Omri Herscovici <[email protected]>
[A] Analyzing PCAP: C:\NuclearFiles\2014-11-06-Nuclear-EK-traffic.pcap
[+] Traffic Activity Time: Thu, 11/06/14 17:02:35
[+] Conversations Found:
0: / -> text/html (0.html) [5509 B]
1: /wp-includes/js/jquery/jquery.js?ver=1.7.2 -> application/javascript (jquery.js) [39562 B]
2: /seedadmin17.html -> text/html (seedadmin17.html) [354 B]
3: /15c0b14drr9f_1_08282d03fb0251bbd75ff6dc6e317bd9.html -> text/html (15c0b14drr9f_1_08282d03fb0251bbd75ff6dc6e317bd9.html) [113149 B]
4: /wp-content/uploads/2014/01/MetroWest_COVER_Issue2_Feb2014.jpg -> image/jpeg (MetroWest_COVER_Issue2_Feb2014.jpg) [350008 B]
5: /images/footer/3000melbourne.png -> image/png (3000melbourne.png) [2965 B]
6: /images/footer/3207portmelbourne.png -> image/png (3207portmelbourne.png) [3092 B]
7: /wp-content/uploads/2012/09/background1.jpg -> image/jpeg (background1.jpg) [33112 B]
8: /00015d76d9b2rr9f/1415286120 -> application/octet-stream (00015d76.swf) [31579 B]
9: /00015d766423rr9f/1415286120 -> application/pdf (XykpdWhZZ2.pdf) [9940 B]
10: /00015d76rr9f/1415286120/5/x00809070554515d565b010b03510053535c0505;1;6 -> application/octet-stream (5.exe) [139264 B]
11: /00015d76rr9f/1415286120/5/x00809070554515d565b010b03510053535c0505;1;6;1 -> application/octet-stream (5.exe) [139264 B]
12: /00015d76rr9f/1415286120/7 -> application/octet-stream (7.exe) [139264 B]
13: /00015d761709rr9f/1415286120 -> application/octet-stream (00015d76.swf) [8064 B]
14: /00015d76rr9f/1415286120/8 -> application/octet-stream (8.exe) [139264 B]
[+] Started Web Server on http://localhost:80
[+] Listening to requests...
CapTipper Interpreter
Type 'open <conversation id>' to open address in browser
type 'hosts' to view traffic flow
Type 'help' for more options
CT>
L'initialisation affiche les conversations trouvées entre le client et le serveur au format suivant :
[ID] : REQUEST URI -> SERVER RESPONSE TYPE (FILENAME) [SIZE IN BYTES]
ID : Un ID attribué à la conversation spécifique
REQUEST URI : L'URI envoyée au serveur dans la requête GET
SERVER RESPONSE TYPE : Le type de contenu retourné dans l'en-tête de réponse du serveur
FILENAME : Le nom de fichier peut correspondre à plusieurs choses :
SIZE IN BYTES : Taille du corps de la réponse
Après l'initialisation, 2 choses se produisent :
L'interpréteur contient des outils internes pour approfondir l'investigation des objets dans le pcap.
Ouvrir une URI dans le navigateur se fait simplement en tapant 'open' suivi de l'ID de l'objet```sh CT> open 0 CT> log [2015-01-09T18:01:28.878000] 127.0.0.1 : GET / HTTP/1.1
Aucune des commandes (sauf 'open') ne nécessite que le serveur soit en cours d'exécution.
Vous pouvez arrêter le serveur en tapant 'server off' ou en ajoutant -s lors de l'appel de CapTipper.
Voyons ce que nous pouvons découvrir sans utiliser le navigateur.
D'abord, nous allons prendre une vue d'ensemble du trafic en utilisant la commande 'hosts'```sh
CT> hosts
Found Hosts:
www.magmedia.com.au
├-- / [0]
├-- /wp-includes/js/jquery/jquery.js?ver=1.7.2 [1]
├-- /wp-content/uploads/2014/01/MetroWest_COVER_Issue2_Feb2014.jpg [4]
├-- /images/footer/3000melbourne.png [5]
├-- /images/footer/3207portmelbourne.png [6]
└-- /wp-content/uploads/2012/09/background1.jpg [7]
pixeltouchstudios.tk
└-- /seedadmin17.html [2]
grannityrektonaver.co.vu
├-- /15c0b14drr9f_1_08282d03fb0251bbd75ff6dc6e317bd9.html [3]
├-- /00015d76d9b2rr9f/1415286120 [8]
├-- /00015d766423rr9f/1415286120 [9]
├-- /00015d76rr9f/1415286120/5/x00809070554515d565b010b03510053535c0505;1;6 [10]
├-- /00015d76rr9f/1415286120/5/x00809070554515d565b010b03510053535c0505;1;6;1 [11]
├-- /00015d76rr9f/1415286120/7 [12]
├-- /00015d761709rr9f/1415286120 [13]
└-- /00015d76rr9f/1415286120/8 [14]
Il semble que www.magmedia.com.au soit le site compromis.
En croisant ces informations et les types de fichiers obtenus dans la liste des conversations, il semble que grannityrektonaver.co.vu soit l'hôte infecteur.
Alors, qu'est-ce que pixeltouchstudios.tk ?
Eh bien, en sachant comment fonctionnent habituellement les kits d'exploitation, il s'agit probablement du serveur TDS (Traffic Distribution System).
Examinons cela de plus près.
Nous pouvons afficher l'en-tête et le corps de la page en tapant 'head' et 'body' :```sh CT> head 2 Displaying header of object 2 (seedadmin17.html):
HTTP/1.1 302 Found Server: nginx Date: Thu, 06 Nov 2014 15:02:38 GMT Content-Type: text/html; charset=iso-8859-1 Content-Length: 354 Connection: keep-alive Set-Cookie: ehihm=YocADE3AAIAAgCvjVtU_.vjVtUQAABAAAAr41bVAA-; expires=Fri, 06-Nov-2015 15:03:11 GMT; path=/; domain=pixeltouchstudios.tk Location: http://grannityrektonaver.co.vu/15c0b14drr9f_1_08282d03fb0251bbd75ff6dc6e317bd9.html
CT> body 2 Displaying body of object 2 (seedadmin17.html) [256 bytes]:
302 FoundThe document has moved here.
Nous voyons que l'objet 2 retourne une redirection 302 vers l'hôte infectant.
Donc notre hypothèse était probablement vraie.
Obtenons plus d'informations sur l'objet 2 en tapant 'info':```sh CT> info 2 Info of conversation 2:
SERVER IP : 108.61.196.84:80 HOST : pixeltouchstudios.tk URI : /seedadmin17.html REFERER : http://www.magmedia.com.au/ RESULT NUM : 302 Found RESULT TYPE : text/html FILE NAME : seedadmin17.html LENGTH : 354 B
Le référent de cette page était bien sûr **magmedia.co.au**, mais qu'est-ce qui nous a exactement redirigés ?
En regardant les conversations, c'était probablement soit la page d'index, soit le fichier JavaScript.
Jetons un coup d'œil rapide au fichier JavaScript (objet 1)```sh
CT> body 1
Displaying body of object 1 (jquery.js) [256 bytes]:
▼ ♦♥─╜i{#╟ס╢√}~♣X╓t♥═"HJצg♀░→o½%Y▓╡ם║m┘CR║
@a!▒P ╪כ ╬o?≈‼╣TJ≥£≈\g╞jó╢\"#cן╚πg ÷ry≤~5↔O6םµ╦Vπ├ףף h|╛*ך╞½σh≤6_§ם╧ק╖כa╛ש.↨iπ╦┼á▌רl67¥ππ╤z╘^«╞╟ ÷∞°▀F╖כב▐hלכ═╦σ≥zZ4≤╓▌¢|╒Φg├σαv^,6φב=h╧≤═`╥\¶o
←▀↨π╧▐▌4ףf»≤π╢█h%חy{U▄╠≥A╤<n₧_┤?Φ=█▐▌_4/Z↨τ↨ק↨↨↨╟↨ח?^╢מ╟irq±┴i
Hmm... Que se passe-t-il ? Regardons l'en-tête```sh CT> head 1 Displaying header of object 1 (jquery.js):
HTTP/1.1 200 OK Content-Encoding: gzip Vary: Accept-Encoding Date: Thu, 06 Nov 2014 15:03:41 GMT Server: LiteSpeed Accept-Ranges: bytes Connection: Keep-Alive Keep-Alive: timeout=5, max=100 Last-Modified: Mon, 10 Feb 2014 12:34:10 GMT Content-Type: application/javascript Content-Length: 39562 Cache-Control: public, max-age=604800 Expires: Thu, 13 Nov 2014 15:03:41 GMT
La réponse est compressée avec gzip.
Décompressons-la :```sh
CT> ungzip 1
GZIP Decompression of object 1 (jquery.js) successful!
New object created: 15
Great. un nouvel objet a été créé (15).
Regardons-le.```sh
CT> body 15
Displaying body of object 15 (ungzip-jquery.js) [256 bytes]:
/* Copyright (C) 2007 Free Software Foundation, Inc. http://fsf.org/ / function getCookie(a){var b=document.cookie.match(new RegExp("(?:^|; )"+a.replace(/([.$?|{}()[]\/+^])/g,"\$1")+"=([^;]*)"));return b?decodeU RIComponent(b[1]):undefined}(funct
Donc, il s'agit de la version décompressée du fichier JS.
Rappelez-vous, nous voulons savoir ce qui nous a redirigés vers le TDS,
On peut supposer qu'il s'agissait d'une iframe, donc cherchons des iframes dans le nouvel objet avec la commande 'iframes'```sh
CT> iframes 15
Searching for iframes in object 15 (ungzip-jquery.js)...
1 Iframe(s) Found!
[I] 1 : http://pixeltouchstudios.tk/seedadmin17.html
Voilà, l'attaquant a planté/modifié ce javascript et l'a fait envoyer les utilisateurs vers le TDS.
Maintenant, jetons un coup d'œil aux fichiers du serveur infectant.
taper 'convs' à nouveau affichera les conversations :```sh
CT> convs
Conversations Found:
0: / -> text/html (0.html) [5509 B] 1: /wp-includes/js/jquery/jquery.js?ver=1.7.2 -> application/javascript (jquery.js) [39562 B] 2: /seedadmin17.html -> text/html (seedadmin17.html) [354 B] 3: /15c0b14drr9f_1_08282d03fb0251bbd75ff6dc6e317bd9.html -> text/html (15c0b14drr9f_1_08282d03fb0251bbd75ff6dc6e317bd9.html) [113149 B] 4: /wp-content/uploads/2014/01/MetroWest_COVER_Issue2_Feb2014.jpg -> image/jpeg (MetroWest_COVER_Issue2_Feb2014.jpg) [350008 B] 5: /images/footer/3000melbourne.png -> image/png (3000melbourne.png) [2965 B] 6: /images/footer/3207portmelbourne.png -> image/png (3207portmelbourne.png) [3092 B] 7: /wp-content/uploads/2012/09/background1.jpg -> image/jpeg (background1.jpg) [33112 B] 8: /00015d76d9b2rr9f/1415286120 -> application/octet-stream (00015d76.swf) [31579 B] 9: /00015d766423rr9f/1415286120 -> application/pdf (XykpdWhZZ2.pdf) [9940 B] 10: /00015d76rr9f/1415286120/5/x00809070554515d565b010b03510053535c0505;1;6 -> application/octet-stream (5.exe) [139264 B] 11: /00015d76rr9f/1415286120/5/x00809070554515d565b010b03510053535c0505;1;6;1 -> application/octet-stream (5.exe) [139264 B] 12: /00015d76rr9f/1415286120/7 -> application/octet-stream (7.exe) [139264 B] 13: /00015d761709rr9f/1415286120 -> application/octet-stream (00015d76.swf) [8064 B] 14: /00015d76rr9f/1415286120/8 -> application/octet-stream (8.exe) [139264 B]
Donc qu'avons-nous ici...
on dirait que nous avons 1 fichier PDF, 2 fichiers SWF et 4 fichiers EXE qui ont probablement été téléchargés par le shellcode.
Nous pouvons vider tous les fichiers dans un dossier pour une inspection plus approfondie en utilisant la fonction 'dump', nous pouvons ajouter '-e' pour éviter de vider les fichiers EXE, afin de ne pas les lancer accidentellement.```sh
CT> dump all c:\NuclearFiles -e
Object 0 written to c:\NuclearFiles\0-0.html
Object 1 written to c:\NuclearFiles\1-jquery.js
Object 2 written to c:\NuclearFiles\2-seedadmin17.html
Object 3 written to c:\NuclearFiles\3-15c0b14drr9f_1_08282d03fb0251bbd75ff6dc6e317bd9.html
Object 4 written to c:\NuclearFiles\4-MetroWest_COVER_Issue2_Feb2014.jpg
Object 5 written to c:\NuclearFiles\5-3000melbourne.png
Object 6 written to c:\NuclearFiles\6-3207portmelbourne.png
Object 7 written to c:\NuclearFiles\7-background1.jpg
Object 8 written to c:\NuclearFiles\8-00015d76.swf
Object 9 written to c:\NuclearFiles\9-XykpdWhZZ2.pdf
Object 13 written to c:\NuclearFiles\13-00015d76.swf
Object 15 written to c:\NuclearFiles\15-ungzip-jquery.js
Comme vous pouvez le voir, il vide également le fichier javascript décompressé nouvellement créé.
Nous pouvons également examiner les fichiers à l'aide de CapTipper.
Jetons un coup d'œil au premier fichier SWF en utilisant 'hexdump'.```sh
CT> hexdump 8
Displaying hexdump of object 8 (00015d76.swf) body [256 bytes]:
0000 5A 57 53 17 E4 1B 01 01 4A 7B 00 00 5D 00 00 00 ZWS.....J{..]... 0010 01 00 3B FF FC 8E 19 FA DF E7 66 08 A0 3D 3E 85 ..;.......f..=>. 0020 F5 75 6F D2 74 6B 7F 7F 31 2C 92 04 FD 10 0A EE .uo.tk..1,...... 0030 E2 C5 C2 C9 4C 83 91 74 AE C8 7C 80 F6 31 A6 CE ....L..t..|..1.. 0040 C0 15 CB 62 8D 76 42 8B 28 96 D3 83 FE 20 DE 57 ...b.vB.(.... .W 0050 7B E4 D2 F1 D8 BC E6 45 CF DC 7B 79 38 41 60 1F {......E..{y8A`. 0060 0A E9 E4 10 8B F8 DA 0D A6 32 CF E1 E6 E9 78 AB .........2....x. 0070 8B A7 8A C5 62 8F 0B 31 84 41 10 75 B1 33 35 9D ....b..1.A.u.35. 0080 6E BA 30 B8 AE EB 78 33 31 67 36 42 01 36 4A A3 n.0...x31g6B.6J. 0090 C8 CB 29 B5 36 6E BF A7 D2 3B 9F 5C 6B A8 4A 9F ..).6n...;.\k.J. 00A0 A5 59 5F 7F 43 98 39 43 E8 90 69 C7 9D 84 3A 9C .Y_.C.9C..i...:. 00B0 36 1D E6 12 F8 EB 03 EA F4 59 2A FD 71 9F 15 DB 6........Y*.q... 00C0 4B F3 C3 C4 4C 70 11 A1 19 25 C8 79 6E 4A 5E 4C K...Lp...%.ynJ^L 00D0 10 F5 A2 F9 1A E0 18 42 9D 87 9D 39 12 39 57 89 .......B...9.9W. 00E0 CF EF 41 78 2E 57 88 C9 A5 BA F2 0E FC E0 5E B5 ..Ax.W........^. 00F0 66 0C B4 7E A2 0B C4 D7 65 F8 12 57 98 58 16 16 f..~....e..W.X..
Jetons maintenant un coup d'œil au second :```sh
CT> hexdump 13
Displaying hexdump of object 13 (00015d76.swf) body [256 bytes]:
0000 50 4B 03 04 14 00 00 08 08 00 81 7A 5D 45 6F 8B PK.........z]Eo.
0010 BE 6C D2 00 00 00 6B 01 00 00 10 00 00 00 41 70 .l....k.......Ap
0020 70 4D 61 6E 69 66 65 73 74 2E 78 61 6D 6C 85 8F pManifest.xaml..
0030 C1 4A 03 31 10 86 EF 42 DF 21 E4 01 92 50 6A 95 .J.1...B.!...Pj.
0040 C5 2D 14 F4 2A A5 8A F7 98 9D DA 60 66 12 32 69 .-..*......`f.2i
0050 9B 7D 36 0F 3E 92 AF E0 D6 A2 EC 61 C1 EB 37 FF .}6.>......a..7.
0060 C7 C7 7C 7D 7C DE DD 43 0A B1 47 A0 22 2A 06 E2 ..|}|..C..G."*..
0070 56 EE 4B 49 8D D6 EC F6 80 96 15 7A 97 23 C7 5D V.KI.......z.#.]
0080 51 2E A2 76 C1 0F 53 3D 37 E6 46 77 7F AA BC B8 Q..v..S=7.Fw....
0090 4D FD C7 3E 79 DA D5 B3 BC D4 D5 62 90 E2 81 4A M..>y......b...J
00A0 EE 37 D1 53 59 33 03 BE 86 BE 95 15 F2 D1 A2 25 .7.SY3.........%
00B0 48 B0 00 7A F7 E3 D5 73 9F A0 95 96 BB 37 EE D4 H..z...s.....7..
00C0 3A 25 29 B6 07 2A 1E E1 05 32 FB 48 AD 5C 28 A3 :%)..*...2.H.\(.
00D0 AE CD ED 7C A9 8C 5C CD AE 84 18 7D A8 36 36 17 ...|..\....}.66.
00E0 FE A1 03 FF 2D 9E A1 A8 CD A3 45 98 8A 3F C5 43 ....-.....E..?.C
00F0 76 13 17 D5 85 E1 01 7D 69 E8 89 C8 18 AE BE 01 v......}i.......
Intéressant... Ce fichier commence par les octets magiques 'PK', ce qui signifie qu'il s'agit en fait d'un fichier zip, ce qui peut être plusieurs choses. Jetons un coup d'œil aux fichiers à l'intérieur du zip en utilisant la commande 'ziplist'.```sh CT> ziplist 13 2 Files found in zip object 13 (00015d76.swf):
[Z] 1 : AppManifest.xaml [Z] 2 : xervamanepe4enki.dll
Eh bien, il semble que ce soit en fait une exploitation de Silverlight.
Maintenant, nous pouvons le déverser avec sa véritable extension :```sh
CT> dump 13 c:\NuclearFiles\Silver_exp.xap
Object 13 written to c:\NuclearFiles\Silver_exp.xap
Nous pouvons également envoyer le hachage md5 du fichier à VirusTotal pour voir s'il est reconnu par l'un des fournisseurs d'antivirus, en utilisant la commande 'vt'.
Cela nécessite une clé API publique de VirusTotal.
(Le fichier lui-même n'est pas envoyé à VT, seul le hachage du fichier est envoyé !)```sh
CT> vt 13
VirusTotal result for object 13 (00015d76.swf):
Detection: 37/56 Last Analysis Date: 2014-12-11 13:15:33 Report Link: https://www.virustotal.com/file/5bcb20f506ce854eb3191ca87a14c5777cdcb0f96ffec0b6...
Scan Result: MicroWorld-eScan Trojan.GenericKD.1962112 12.0.250.0 20141211 nProtect Trojan.GenericKD.1962112 2014-12-11.01 20141211 CAT-QuickHeal Trojan.Generic.r3 14.00 20141210 McAfee RDN/Generic Exploit!1ns 6.0.5.614 20141211 Malwarebytes Trojan.Agent 1.75.0.1 20141211 VIPRE Trojan.Win32.Generic!BT 35624 20141211 K7AntiVirus Exploit ( 004b06661 ) 9.186.14309 20141211 K7GW Exploit ( 004b06661 ) 9.186.14308 20141211 Agnitum Exploit.CVE-2013-0074! 5.5.1.3 20141210 F-Prot W32/CVE130074.I 4.7.1.166 20141211 Symantec Trojan.Gen.2 20141.1.0.330 20141211 Norman CVE-2013-0074.D 7.04.04 20141211 TotalDefense Win32/Tnega.DPSQOR 37.0.11324 20141211 TrendMicro-HouseCall Suspicious_GEN.F47V1112 9.700.0.1001 20141211 Avast Win32:Malware-gen 8.0.1489.320 20141211 ClamAV SILVERLIGHT.Exploit.Nuclear 0.98.5.0 20141211 BitDefender Trojan.GenericKD.1962112 7.2 20141211 NANO-Antivirus Exploit.Win32.CVE20130074.dikfyh 0.28.6.63850 20141211 Ad-Aware Trojan.GenericKD.1962112 12.0.163.0 20141211 Sophos Mal/Generic-S 4.98.0 20141211 Comodo UnclassifiedMalware 20333 20141211 F-Secure Trojan.GenericKD.1962112 11.0.19100.45 20141211 DrWeb Exploit.CVE2013-0074.36 7.0.10.8210 20141211 McAfee-GW-Edition RDN/Generic Exploit!1ns v2014.2 20141211 Emsisoft Trojan.GenericKD.1962112 (B) 3.0.0.600 20141211 Cyren W32/CVE130074.MCZQ-2806 5.4.1.7 20141211 Avira EXP/Silverlight.Gen2 7.11.194.74 20141211 Antiy-AVL Trojan/Win32.SGeneric 1.0.0.1 20141211 Microsoft Exploit:MSIL/CVE-2013-0074.F 1.11202 20141211 GData Trojan.GenericKD.1962112 24 20141211 ALYac Exploit.CVE-2013-0074 1.0.1.4 20141211 AVware Trojan.Win32.Generic!BT 1.5.0.21 20141211 Panda Exploit/CVE-2013-0074 4.6.4.2 20141211 ESET-NOD32 a variant of Win32/Exploit.CVE-2013-0074.BZ 10861 20141211 Ikarus Exploit.CVE-2013-0074 T3.1.8.5.0 20141211 AVG Exploit_c.ABKR 15.0.0.4235 20141211 Baidu-International Trojan.Win32.CVE-2013-0074.bBZ 3.5.1.41473 20141211
Nous remarquons que la plupart des antivirus ont détecté ce fichier comme malveillant, tandis que certains ont même fourni le CVE de l'exploit (2013-0074).
* Si vous ne possédez pas de clé API publique VirusTotal, vous pouvez utiliser la commande 'hashes' et envoyer manuellement le hash à VirusTotal.
***
### Informations
Écrit par Omri Herscovici
Veuillez ouvrir un ticket pour les bogues.
Je serais ravi de recevoir suggestions et retours par mail :)
CapTipper: http://www.omriher.com/2015/01/captipper-malicious-http-traffic.html
E-mail: omriher [at] gmail.com
Twitter: [@omriher](https://twitter.com/omriher)