HACKING CON UNICODE

HACKING CON UNICODE
Daniel Tapia

Hola a todos, mi nombre es Daniel Monzón y en este primer post me gustaría comentar un tema que he investigado hace poco y que me parece muy interesante. Vamos a hablar sobre Unicode, qué es y cómo usarlo en ejercicios de Red Team o pentests.

Unicode (al contrario de lo que parece) no es un tipo de encoding, es una base de datos que mapea cualquier símbolo (glifo) existente a un número único llamado code point (al cual se le asigna también un nombre único).

Por ejemplo “A” se mapea a U+0041 y “a” se mapea a U+0061

Existen caracteres Unicode desde U+000000 hasta U+10FFFF (hay más de un millón de símbolos). Unicode divide todos esos posibles símbolos en “planos”, el más conocido es el BMP (Basic Multilingual Plane) que va desde U+0000 hasta U+FFFF (es el plano de Unicode número 1, existen 16 más, denominados “planos astrales”).

 

Unicode se puede usar en Javascript y la manera de representarlo es con secuencias de escape:

https://mathiasbynens.be/notes/javascript-escapes

Secuencias de escape Unicode (para BMP):

\u0041\u0042

Secuencias de escape Unicode ECMA Script 6:

\u{41} (BMP)

\u{1F4A9} (Planos “astrales”) (A partir de PHP 7 también se puede usar esto en PHP)

Los caracteres Unicode de los llamados planos “astrales” también se pueden representar como “surrogate pairs” en UTF-16 (ver https://en.wikipedia.org/wiki/UTF-16)

Existe otra feature de Unicode llamada normalización. Existe de varios tipos: NFC, NFD, NFKD, NFKC. La idea es “normalizar” algunos code-points para acabar teniendo el mismo carácter.

Podemos hacer pruebas en Python con el módulo «unicodedata» y su función normalice, también hay funciones implementadas para esto en PHP (https://www.php.net/manual/en/class.normalizer.php)

Ver: https://en.wikipedia.org/wiki/Unicode_equivalence


Ahora bien, ¿qué podemos hacer nosotros como atacantes con Unicode?

  1. Podemos usar https://github.com/UndeadSec/EvilURL para buscar nombres de dominios parecidos a los que queremos suplantar para hacer phishing (como veis la URL que genera no existe)

 

2) Inyecciones SQL:

– Se puede usar Unicode para bypassear funciones de sanitización de input custom (aprovechando la normalización de caracteres Unicode).

https://medium.com/hackernoon/ʼ-śℇℒℇℂʈ-how-unicode-homoglyphs-will-break-your-custom-sql-injection-sanitizing-functions-1224377f7b51

https://medium.com/bugbountywriteup/moodle-lms-sql-injection-using-unicode-characters-fe01232f2727

-También podemos usar Unicode para terminar strings en MySQL (en vez de — – por ejemplo) si el charset no es utf8mb4

 

 

3) WAF bypass (ver PayloadAllTheThings XSS en Github)

https://medium.com/bugbountywriteup/unicode-vs-waf-xss-waf-bypass-128cd9972a30

https://jlajara.gitlab.io/web/2020/02/19/Bypass_WAF_Unicode.html

 

4) Path traversal: también podemos usarlo para conseguir path traversals que tengan restricciones de caracteres (usando %c1%1c y %c0%af por ejemplo en vez de ../)

https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Directory%20Traversal#16-bits-unicode-encoding

https://www.securityfocus.com/archive/1/473311/100/0/threaded

%c0%ae%c0%ae (representación hexadecimal de ..) y otros payloads de PayloadAllTheThings

 

5) Extensiones de archivos: se pueden “falsificar” extensiones de archivos con RTLO (U+202E), además de bypassear whitelists y blacklists tradicionales con extensiones equivalentes en Unicode.

https://github.com/ctrlaltdev/RTLO-attack (con esto podemos ver cómo aparentemente se “cambia” la extensión del archivo)

 

https://medium.com/swlh/hacking-the-web-with-unicode-73d0f0c97aab

6) CRLF y Open redirects:

\u2028 y \u2029 -> se les pueden dar el mismo uso que a %0a y %0d

Payload CRLF Unicode -> %E5%98%8A%E5%98%8DSet-Cookie:%20test

 

https://medium.com/cyberverse/crlf-injection-playbook-472c67f1cb46

https://dl.packetstormsecurity.net/1602-exploits/Node-js-Response-Splitting.pdf

https://pentester.land/cheatsheets/2018/11/02/open-redirect-cheatsheet.html

 

7) Account takeover: si sabemos que existe un usuario admin en una app web, hay veces que al registrar un usuario como Ãđpodemos acabar sobreescribiendo sus datos y tomando el control de su cuenta. O incluso si solo permiten registro desde cierto dominio podemos bypassear la whitelist con Unicode. A veces incluso también podemos abusar de esto en password resets.

https://engineering.atspotify.com/2013/06/18/creative-usernames/

https://medium.com/cyberverse/got-bounty-with-account-takeover-ato-unicode-case-mapping-collision-d23a7785e1be

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-19844

https://www.bugcrowd.com/blog/hacking-unicode-like-a-boss/

Para encontrar caracteres equivalentes en Unicode yo suelo usar: http://www.irongeek.com/homoglyph-attack-generator.php

 

8) Errores de memoria: muchos programas tienen problemas para manejar caracteres Unicode y da lugar a errores tipo stack buffer overflow, heap-based overflow, out-of-bounds read/write, integer overflow, UAF y otros por el estilo.

 

En Unicode existen desde los típicos caracteres de control: https://www.compart.com/en/unicode/category/Cc hasta caracteres vacíos (U+2800 y U+200C), un ejemplo de esto pueden ser los títulos de algunos vídeos como este: https://www.youtube.com/watch?v=dmBvw8uPbrA

Incluso hay “colisiones” en Unicode al convertir de mayúsculas a minúsculas que pueden acabar siendo fallos de seguridad: https://eng.getwisdom.io/hacking-github-with-unicode-dotless-i/

Hay un sinfín de cosas curiosas y útiles que pueden hacerse con Unicode, seguramente muchas más de las que yo he podido encontrar. Espero que os haya gustado. ¡Hasta la próxima!

-Daniel Monzón-

Referencias:

https://eng.getwisdom.io/awesome-unicode

https://codepoints.net

http://www.russellcottrell.com/greek/utilities/SurrogatePairCalculator.htm

https://www.youtube.com/watch?v=HhIEDWmQS3w

https://book.hacktricks.xyz/pentesting-web/unicode-normalization-vulnerability

https://medium.com/concerning-pharo/an-implementation-of-unicode-normalization-7c6719068f43

http://www.unicode.org/reports/tr15/

https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/

https://withblue.ink/2019/03/11/why-you-need-to-normalize-unicode-strings.html

https://exploringjs.com/es6/ch_unicode.html

https://github.com/walling/unorm

https://www.bugcrowd.com/blog/hacking-unicode-like-a-boss/

http://www.irongeek.com/homoglyph-attack-generator.php

https://medium.com/swlh/hacking-the-web-with-unicode-73d0f0c97aab

https://0xsha.io/posts/the-fall-of-mighty-django-exploiting-unicode-case-transformations

https://www.hackplayers.com/2018/04/evilurl-dominios-para-ataques-homograficos.html

https://www.online-toolz.com/tools/text-unicode-entities-convertor.php

https://www.php.net/manual/es/migration70.new-features.php#migration70.new-features.unicode-codepoint-escape-syntax

https://blog.websecurify.com/2014/07/hacking-unicode.html