Решая задачи на ringzer0team.com(Существует с 2014 г, на данный момент содержит около двухсот челленджей на любой вкус.
Примеры тематик: Binaries (Windows / Linux), Cryptography, SQL Injection, JavaScript, Shellcoding), наткнулся на интересную тему!
Вообщем нужно в течение 2-х секунд залогиниться на сайте, перейти в тему, распознать капчу и перейти по URL с текстом капчи и только после этого
мы получаем FLAG за который нам дают 6 баллов!
Алгоритм решения проблемы:
Берем Cookies из браузера(FireFox >> Исследовать элемент >> Сеть >> Ищем POST запрос >> Выбираем Куки) и с помощью их будем идти POSTом на сайт, парсить картинку(Хранится она виде строки Base64 формата png) и сохранять ее на диск D, нам нужно распознать текст с картинки где будем использовать библиотеку tessnet2 хабр, получаем текст и идем постом на URL с текстом, в ответ мы получаем HTML страницу с нашим флагом! все очень просто..
Для реализации этой проблемы я буду использовать язык программирования С#.
Начнем кодить..
Для начало нужно добавить в проект либу tessnet2(x64, x86)!
Нам нужно залогиниться и с парсить картинку. Для этого пишем метод POST запроса!
Теперь нужно написать метод для распознания текста с картинки
И вот финишная прямая...
Кидаем button на форму и в его событии button1_Click вызываем наши методы.
Так как на сайте captcha хранится в строке base64 формата png, нам нужно с парсить данной строку!
Вот собственно весь код:
Примеры тематик: Binaries (Windows / Linux), Cryptography, SQL Injection, JavaScript, Shellcoding), наткнулся на интересную тему!
Вообщем нужно в течение 2-х секунд залогиниться на сайте, перейти в тему, распознать капчу и перейти по URL с текстом капчи и только после этого
мы получаем FLAG за который нам дают 6 баллов!
Алгоритм решения проблемы:
Берем Cookies из браузера(FireFox >> Исследовать элемент >> Сеть >> Ищем POST запрос >> Выбираем Куки) и с помощью их будем идти POSTом на сайт, парсить картинку(Хранится она виде строки Base64 формата png) и сохранять ее на диск D, нам нужно распознать текст с картинки где будем использовать библиотеку tessnet2 хабр, получаем текст и идем постом на URL с текстом, в ответ мы получаем HTML страницу с нашим флагом! все очень просто..
Для реализации этой проблемы я буду использовать язык программирования С#.
Начнем кодить..
Для начало нужно добавить в проект либу tessnet2(x64, x86)!
Нам нужно залогиниться и с парсить картинку. Для этого пишем метод POST запроса!
Код:
public string POST(string Url, string Data)//URL и параметры
{
System.Net.WebRequest req = System.Net.WebRequest.Create(Url);
req.Method = "POST";
req.Timeout = 1000000;
req.ContentType = "application/x-www-form-urlencoded";
// Мои cookies, перейдя по ссылке, мы сразу будем залогинены!
req.Headers.Add("Cookie: _ga=GA1.2.1730485327.1473256666; PHPSESSID=p597jsrhddns0a4vg35mq5ltm5"); //Найти их можно в браузере
byte[] sentData = Encoding.GetEncoding(1251).GetBytes(Data);
req.ContentLength = sentData.Length;
System.IO.Stream sendStream = req.GetRequestStream();
sendStream.Write(sentData, 0, sentData.Length);
sendStream.Close();
System.Net.WebResponse res = req.GetResponse();
System.IO.Stream ReceiveStream = res.GetResponseStream();
System.IO.StreamReader sr = new System.IO.StreamReader(ReceiveStream, Encoding.UTF8);
//Кодировка указывается в зависимости от кодировки ответа сервера
Char[] read = new Char[256];
int count = sr.Read(read, 0, 256);
string Out = String.Empty;
while (count > 0)
{
String str = new String(read, 0, count);
Out += str;
count = sr.Read(read, 0, 256);
}
return Out;
}
Код:
public string anticaptcha()
{
Bitmap bmp = new Bitmap(@"D:\1.png"); // на диске D будем будем считывать картинку, которую чуть позже мы ее с парсим с сайта
pictureBoxInput.Image = (Bitmap)bmp.Clone();// загружаем ее в pictureBox
Color c;
for (int x = 0; x < bmp.Width; x++)//Проверяем каждый пиксель
{
for (int y = 0; y < bmp.Height; y++)
{
c = bmp.GetPixel(x, y);
//Если пиксель не равен белому цвету, ты мы его закрашиваем черным, т.к. у нас текст на картинке белый!
if ((c.A == 255) && (c.B == 255) && (c.G == 255) && (c.R == 255))
{ }
else
{
bmp.SetPixel(x, y, Color.Black);
pictureBoxInput.Image = bmp; // возвращаем картинку в pictureBox
}
}
// Теперь у нас получалась картинка с черным фоном и белым текстом, это все для упрощения распознания текста(либой tessnet2)
}
Ocr ocr = new Ocr();
tessnet2.Tesseract tessocr = new tessnet2.Tesseract();
tessocr.SetVariable("tessedit_char_whitelist", "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm0123456789");
tessocr.Init(null, "eng", true);
List<tessnet2.Word> text = ocr.DoOCRNormal((Bitmap)pictureBoxInput.Image, "eng");
string sd = text[0].Text;
text = ocr.DoOCRNormal((Bitmap)pictureBox1.Image, "eng");
pictureBoxInput.Image = null;
return sd;
}
// создаем класс для работы c tessnet2
public class Ocr
{
public List<tessnet2.Word> DoOCRNormal(Bitmap image, string lang)
{
tessnet2.Tesseract ocr = new tessnet2.Tesseract();
ocr.Init(null, lang, false);
List<tessnet2.Word> result = ocr.DoOCR(image, Rectangle.Empty);
return result;
}
}
Кидаем button на форму и в его событии button1_Click вызываем наши методы.
Так как на сайте captcha хранится в строке base64 формата png, нам нужно с парсить данной строку!
Код:
private void button1_Click(object sender, EventArgs e)
{
string imageBase64 = "";//Тут будем хранить строку Base64
//так мы использовали куки в методе POST идем постом сразу в тему и ответ мы получаем html страницу!
textBox1.Text = POST("https://ringzer0team.com/challenges/17", "");
//очищаем html код от нашего base64!
textBox1.Text = textBox1.Text.Replace(" ", "");
textBox1.Text = textBox1.Text.Replace("<br />", "");
//Получаем Base64
imageBase64 = return_string(textBox1.Text, "data:image/png;base64,", "<h4>Submit flag</h4>");
//ковертируем засовывыем получаный base64 в байты!
byte[] byte_image = System.Convert.FromBase64String(imageBase64);
//сохраняем файл на диске D
using (FileStream fs = new FileStream(@"D:\1.png", FileMode.Create))
{
fs.Write(byte_image, 0, byte_image.Length);
fs.Close();
}
textBoxInput.Text = anticaptcha();//получаем текст с картинки
//отправляем текст по URL
textBox1.Text = POST("https://ringzer0team.com/challenges/17/" + textBoxInput.Text, "");
//и в ответ получаем html страницу, в который будет FLAG, в таком виде FLAG-sdfJSDoweijreri23SDFsdf
}
//Функция для очистки текста от мусора!
public string return_string(string text, string tag1, string tag2)
{
int sim1 = text.IndexOf(tag1) + tag1.Length;
int sim2 = text.IndexOf(tag2);
int sim_length = sim2 - sim1;
return text.Substring(sim1, sim_length - 33);
}
Код:
//--------- C# ---------------
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace FillBitmap
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string imageBase64 = "";
textBox1.Text = POST("https://ringzer0team.com/challenges/17", "");
textBox1.Text = textBox1.Text.Replace(" ", "");
textBox1.Text = textBox1.Text.Replace("<br />", "");
imageBase64 = return_string(textBox1.Text, "data:image/png;base64,", "<h4>Submit flag</h4>");
byte[] byte_image = System.Convert.FromBase64String(imageBase64);
using (FileStream fs = new FileStream(@"D:\1.png", FileMode.Create))
{
fs.Write(byte_image, 0, byte_image.Length);
fs.Close();
}
textBoxInput.Text = anticaptcha();
textBox1.Text = POST("https://ringzer0team.com/challenges/17/" + textBoxInput.Text, "");
}
public string POST(string Url, string Data)
{
System.Net.WebRequest req = System.Net.WebRequest.Create(Url);
req.Method = "POST";
req.Timeout = 1000000;
req.ContentType = "application/x-www-form-urlencoded";
req.Headers.Add("Cookie: _ga=GA1.2.1730485327.1473256666; PHPSESSID=p597jsrhddns0a4vg35mq5ltm5");
byte[] sentData = Encoding.GetEncoding(1251).GetBytes(Data);
req.ContentLength = sentData.Length;
System.IO.Stream sendStream = req.GetRequestStream();
sendStream.Write(sentData, 0, sentData.Length);
sendStream.Close();
System.Net.WebResponse res = req.GetResponse();
System.IO.Stream ReceiveStream = res.GetResponseStream();
System.IO.StreamReader sr = new System.IO.StreamReader(ReceiveStream, Encoding.UTF8);
//Кодировка указывается в зависимости от кодировки ответа сервера
Char[] read = new Char[256];
int count = sr.Read(read, 0, 256);
string Out = String.Empty;
while (count > 0)
{
String str = new String(read, 0, count);
Out += str;
count = sr.Read(read, 0, 256);
}
return Out;
}
public string return_string(string text, string tag1, string tag2)
{
int sim1 = text.IndexOf(tag1) + tag1.Length;
int sim2 = text.IndexOf(tag2);
int sim_length = sim2 - sim1;
return text.Substring(sim1, sim_length - 33);
}
public string anticaptcha()
{
Bitmap bmp = new Bitmap(@"D:\1.png");
pictureBoxInput.Image = (Bitmap)bmp.Clone();
Color c;
for (int x = 0; x < bmp.Width; x++)
{
for (int y = 0; y < bmp.Height; y++)
{
c = bmp.GetPixel(x, y);
if ((c.A == 255) && (c.B == 255) && (c.G == 255) && (c.R == 255))
{ }
else
{
bmp.SetPixel(x, y, Color.Black);
pictureBoxInput.Image = bmp;
}
}
}
Ocr ocr = new Ocr();
tessnet2.Tesseract tessocr = new tessnet2.Tesseract();
//символо которые будут присутствовать на картинке
tessocr.SetVariable("tessedit_char_whitelist", "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm0123456789");
tessocr.Init(null, "eng", true);
List<tessnet2.Word> text = ocr.DoOCRNormal((Bitmap)pictureBoxInput.Image, "eng");
string sd = text[0].Text;
text = ocr.DoOCRNormal((Bitmap)pictureBox1.Image, "eng");
pictureBoxInput.Image = null;
return sd;
}
}
public class Ocr
{
public List<tessnet2.Word> DoOCRNormal(Bitmap image, string lang)
{
tessnet2.Tesseract ocr = new tessnet2.Tesseract();
ocr.Init(null, lang, false);
List<tessnet2.Word> result = ocr.DoOCR(image, Rectangle.Empty);
return result;
}
}
}