foo
This commit is contained in:
		
							parent
							
								
									8b7b40d3ab
								
							
						
					
					
						commit
						600d7146d3
					
				
					 21 changed files with 175 additions and 39 deletions
				
			
		
							
								
								
									
										2
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							|  | @ -77,3 +77,5 @@ Thumbs.db | |||
| 
 | ||||
| # Clion | ||||
| .idea/ | ||||
| .tox | ||||
| *.egg-info | ||||
|  |  | |||
|  | @ -19,7 +19,6 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) | |||
| set(PLUGIN_DIR ${CMAKE_BINARY_DIR}/plugins) | ||||
| 
 | ||||
| find_package(Qt5 COMPONENTS Widgets REQUIRED) | ||||
| find_package(cppzmq REQUIRED) | ||||
| find_package(nlohmann_json REQUIRED) | ||||
| find_package(SQLite3 REQUIRED) | ||||
| find_package(Catch2 REQUIRED) | ||||
|  | @ -27,7 +26,6 @@ find_package(Catch2 REQUIRED) | |||
| add_executable(bigsnitch | ||||
|         main.cpp | ||||
|         mainwindow.cpp | ||||
|         networkthread.cpp | ||||
|         session.cpp | ||||
|         httpflow.cpp | ||||
|         pluginhandler.cpp | ||||
|  | @ -38,7 +36,6 @@ add_executable(bigsnitch | |||
| 
 | ||||
|         mainwindow.h | ||||
|         httpflow.h | ||||
|         networkthread.h | ||||
|         session.h | ||||
|         includes.h | ||||
|         proxyhandler.h | ||||
|  | @ -55,18 +52,18 @@ add_executable(bigsnitch | |||
|         mainwindow.ui | ||||
|         editandresend.ui | ||||
|         settings.ui | ||||
|         pluginlist.ui | ||||
|         ) | ||||
| 
 | ||||
| target_include_directories(bigsnitch PRIVATE /usr/local/include) | ||||
| target_link_libraries(bigsnitch PRIVATE Qt5::Widgets cppzmq sqlite3) | ||||
| target_link_libraries(bigsnitch PRIVATE Qt5::Widgets sqlite3) | ||||
| 
 | ||||
| add_executable(bigsnitch_tests | ||||
|         tests/generic_tests.cpp | ||||
|         networkthread.cpp | ||||
|         ) | ||||
| 
 | ||||
| target_include_directories(bigsnitch_tests PRIVATE /usr/local/include) | ||||
| target_link_libraries(bigsnitch_tests PRIVATE Qt5::Widgets cppzmq sqlite3 Catch2::Catch2) | ||||
| target_link_libraries(bigsnitch_tests PRIVATE Qt5::Widgets sqlite3 Catch2::Catch2) | ||||
| 
 | ||||
| add_subdirectory(plugins/mitmproxy/) | ||||
| 
 | ||||
|  |  | |||
|  | @ -6,11 +6,13 @@ namespace Ui { | |||
| class EditAndResend; | ||||
| } | ||||
| 
 | ||||
| //! EditAndResend Dialog
 | ||||
| class EditAndResend : public QDialog | ||||
| { | ||||
|     Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
|     //! EditAndResend constructor
 | ||||
|     explicit EditAndResend(std::tuple<QString, QString, QString, QString> initial, QWidget *parent = nullptr); | ||||
|     ~EditAndResend(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ | |||
| #include <mutex> | ||||
| #include <sstream> | ||||
| 
 | ||||
| //! The HistoryModel implements the AbstractTableModel for interacting with the view.
 | ||||
| class HistoryModel : public QAbstractTableModel | ||||
| { | ||||
|     Q_OBJECT | ||||
|  | @ -15,19 +16,28 @@ private: | |||
|     std::string getRequestHeader(const HistoryItem& item) const; | ||||
|     std::string getResponseHeader(const HistoryItem& item) const; | ||||
| public: | ||||
|     //! HistoryModel constructor
 | ||||
|     HistoryModel(QObject *parent = nullptr); | ||||
|     //! rowCount
 | ||||
|     int rowCount(const QModelIndex &parent = QModelIndex()) const override; | ||||
|     //! columnCount
 | ||||
|     int columnCount(const QModelIndex &parent = QModelIndex()) const override; | ||||
|     //! data
 | ||||
|     QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; | ||||
|     //! headerData
 | ||||
|     QVariant headerData(int section, Qt::Orientation orientation, int role) const override; | ||||
|     //! update
 | ||||
|     void update(std::vector<HistoryItem>* items); | ||||
| }; | ||||
| 
 | ||||
| //! HistoryProxyModel implements a SortFilterProxyModel for interacting with the view
 | ||||
| class HistoryProxyModel : public QSortFilterProxyModel | ||||
| { | ||||
|     Q_OBJECT | ||||
| private: | ||||
| public: | ||||
|     //! lessThan
 | ||||
|     bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override; | ||||
|     //! filterAcceptsRow
 | ||||
|     bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override; | ||||
| }; | ||||
|  |  | |||
|  | @ -3,14 +3,6 @@ | |||
| //major minor patch
 | ||||
| #define LITTLESNITCH_VERSION 100 | ||||
| 
 | ||||
| #include <QtCore/QtGlobal> | ||||
| 
 | ||||
| #if defined(IS_PROXY_LIBRARY) | ||||
| #  define MYSHAREDLIB_EXPORT Q_DECL_EXPORT | ||||
| #else | ||||
| #  define MYSHAREDLIB_EXPORT Q_DECL_IMPORT | ||||
| #endif | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <map> | ||||
| #include <vector> | ||||
|  |  | |||
|  | @ -21,8 +21,11 @@ namespace http { | |||
| */ | ||||
| class ProxyInterface { | ||||
| public: | ||||
|     // the path the proxy listens on
 | ||||
|     std::string path; | ||||
|     virtual ~ProxyInterface() = default; | ||||
|     //! returns name of the plugin
 | ||||
|     virtual QString getName() = 0; | ||||
|     //! returns, whether the proxy is currently connected
 | ||||
|     virtual bool connected() = 0; | ||||
|     //! disconnects the handle
 | ||||
|  |  | |||
|  | @ -2,7 +2,6 @@ | |||
| #include <historymodel.h> | ||||
| #include "./ui_mainwindow.h" | ||||
| #include <QtGui> | ||||
| #include "networkthread.h" | ||||
| 
 | ||||
| MainWindow::MainWindow(QWidget *parent) | ||||
|     : QMainWindow(parent), | ||||
|  | @ -10,20 +9,17 @@ MainWindow::MainWindow(QWidget *parent) | |||
| { | ||||
|     qRegisterMetaType<http::Flow>("httpflow"); | ||||
|     current_session = new Session(); | ||||
|     // TODO: make configurable
 | ||||
|     current_session->load("/tmp/littlesnitch.session"); | ||||
| 
 | ||||
|     // TODO: use relative paths
 | ||||
|     plugin_handler.loadPlugins(QDir("/home/end/projects/bigsnitch/build/plugins/")); | ||||
| 
 | ||||
|     /*
 | ||||
|     thread = new QThread; | ||||
|     NetworkThread* worker = new NetworkThread(); | ||||
|     worker->moveToThread(thread); | ||||
|     connect(thread, SIGNAL (started()), worker, SLOT (process())); | ||||
|     //connect(worker, SIGNAL (error(QString)), this, SLOT (errorString(QString)));
 | ||||
|     connect(worker, SIGNAL (httpMessage(http::Flow)), current_session, SLOT (saveFlow(http::Flow)), Qt::QueuedConnection); | ||||
|     connect(worker, SIGNAL (httpMessage(http::Flow)), this, SLOT (updateHistory()), Qt::QueuedConnection); | ||||
|     thread->start(); | ||||
| */ | ||||
|     // TODO: fix error string
 | ||||
|     //QObject::connect(plugin_handler, SIGNAL (proxy_error(QString)), this, SLOT ( errorString(QString)), Qt::QueuedConnection);
 | ||||
|     QObject::connect(&plugin_handler, SIGNAL (proxy_message(http::Flow)), this, SLOT (updateHistory()), Qt::QueuedConnection); | ||||
|     QObject::connect(&plugin_handler, SIGNAL (proxy_message(http::Flow)), current_session, SLOT (saveFlow(http::Flow)), Qt::QueuedConnection); | ||||
| 
 | ||||
|     history_model.update(current_session->getHistoryItems()); | ||||
|     history_proxy.setSourceModel(&history_model); | ||||
| 
 | ||||
|  |  | |||
|  | @ -13,6 +13,7 @@ QT_BEGIN_NAMESPACE | |||
| namespace Ui { class MainWindow; } | ||||
| QT_END_NAMESPACE | ||||
| 
 | ||||
| //! MainWindow
 | ||||
| class MainWindow : public QMainWindow | ||||
| { | ||||
|     Q_OBJECT | ||||
|  | @ -34,15 +35,23 @@ private: | |||
|     // hack for supplying the initial data to edit&resend
 | ||||
|     std::tuple<QString, QString, QString, QString> current_selection; | ||||
| public: | ||||
|     //! MainWindow constructor
 | ||||
|     MainWindow(QWidget *parent = nullptr); | ||||
|     ~MainWindow(); | ||||
|     //! opens the EditAndResend window
 | ||||
|     void openEditAndResend(); | ||||
| public slots: | ||||
|     //! triggers a history update
 | ||||
|     void updateHistory(); | ||||
|     //! right click menu
 | ||||
|     void editMenuRequested(QPoint pos); | ||||
|     //! right click menu
 | ||||
|     void edit2MenuRequested(QPoint pos); | ||||
|     //! right click menu
 | ||||
|     void edit3MenuRequested(QPoint pos); | ||||
|     //! right click menu
 | ||||
|     void edit4MenuRequested(QPoint pos); | ||||
|     //! right click menu
 | ||||
|     void historyMenuRequested(QPoint pos); | ||||
| private slots: | ||||
|     void on_selectionChange(const QItemSelection& selection); | ||||
|  |  | |||
							
								
								
									
										3
									
								
								mitmaddon/requirements.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								mitmaddon/requirements.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | |||
| mitmproxy | ||||
| mitmdump | ||||
| pyzmq | ||||
							
								
								
									
										6
									
								
								mitmaddon/setup.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								mitmaddon/setup.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | |||
| #!/usr/bin/env python | ||||
| from setuptools import setup, find_packages | ||||
| 
 | ||||
| setup(name='bigsnitch-mitmaddon', | ||||
|       version='1.0', | ||||
|       packages=find_packages()) | ||||
							
								
								
									
										15
									
								
								mitmaddon/tox.ini
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								mitmaddon/tox.ini
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | |||
| [tox] | ||||
| skipsdist = true | ||||
| envlist = py3 | ||||
| 
 | ||||
| # Add environment to use the default python3 installation | ||||
| [testenv:py3] | ||||
| basepython = python3 | ||||
| 
 | ||||
| [testenv] | ||||
| usedevelop = true | ||||
| deps = -r{toxinidir}/requirements.txt | ||||
| setenv = | ||||
|     PYTHONDONTWRITEBYTECODE=1 | ||||
| commands = | ||||
|     {envpython} sh ../test.sh | ||||
|  | @ -15,6 +15,10 @@ bool PluginHandler::load(QString path) | |||
|         qDebug() << "loading plugin " << plugin; | ||||
|         proxyhandler.loadPlugin(plugin); | ||||
|         loaded_plugins += path; | ||||
| 
 | ||||
|         QObject::connect(plugin, SIGNAL (error(QString)), this, SIGNAL (proxy_error(QString)), Qt::QueuedConnection); | ||||
|         QObject::connect(plugin, SIGNAL (message(http::Flow)), this, SIGNAL (proxy_message(http::Flow)), Qt::QueuedConnection); | ||||
| 
 | ||||
|         return true; | ||||
|     } else { | ||||
|         qDebug() << "fo " << loader.errorString(); | ||||
|  |  | |||
|  | @ -7,12 +7,25 @@ | |||
| #include <QPluginLoader> | ||||
| #include <proxyhandler.h> | ||||
| 
 | ||||
| class PluginHandler | ||||
| //! PluginHandler controls all plugins.
 | ||||
| //! Every different plugin interface, that got signals has to reference them here
 | ||||
| //! Other parts of bigsnitch connect to them here.
 | ||||
| class PluginHandler : public QObject | ||||
| { | ||||
|     Q_OBJECT | ||||
| private: | ||||
|     QStringList loaded_plugins; | ||||
|     http::ProxyHandler proxyhandler; | ||||
| public: | ||||
|     //! Loads a single plugin.
 | ||||
|     bool load(QString path); | ||||
|     //! loads all plugins in a directory.
 | ||||
|     void loadPlugins(QDir path); | ||||
| 
 | ||||
| signals: | ||||
| 
 | ||||
|     //! error signal from ProxyInterface
 | ||||
|     void proxy_error(QString err); | ||||
|     //! message signal from ProxyInterface
 | ||||
|     void proxy_message(http::Flow flow); | ||||
| }; | ||||
|  |  | |||
							
								
								
									
										70
									
								
								pluginlist.ui
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								pluginlist.ui
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,70 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ui version="4.0"> | ||||
|  <class>Form</class> | ||||
|  <widget class="QWidget" name="Form"> | ||||
|   <property name="geometry"> | ||||
|    <rect> | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>701</width> | ||||
|     <height>626</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="windowTitle"> | ||||
|    <string>Form</string> | ||||
|   </property> | ||||
|   <layout class="QHBoxLayout" name="horizontalLayout"> | ||||
|    <item> | ||||
|     <widget class="QTreeView" name="treeView"> | ||||
|      <property name="minimumSize"> | ||||
|       <size> | ||||
|        <width>300</width> | ||||
|        <height>0</height> | ||||
|       </size> | ||||
|      </property> | ||||
|     </widget> | ||||
|    </item> | ||||
|    <item> | ||||
|     <spacer name="verticalSpacer"> | ||||
|      <property name="orientation"> | ||||
|       <enum>Qt::Vertical</enum> | ||||
|      </property> | ||||
|      <property name="sizeHint" stdset="0"> | ||||
|       <size> | ||||
|        <width>20</width> | ||||
|        <height>40</height> | ||||
|       </size> | ||||
|      </property> | ||||
|     </spacer> | ||||
|    </item> | ||||
|    <item> | ||||
|     <widget class="QFrame" name="frame"> | ||||
|      <property name="minimumSize"> | ||||
|       <size> | ||||
|        <width>300</width> | ||||
|        <height>0</height> | ||||
|       </size> | ||||
|      </property> | ||||
|      <property name="frameShape"> | ||||
|       <enum>QFrame::StyledPanel</enum> | ||||
|      </property> | ||||
|      <property name="frameShadow"> | ||||
|       <enum>QFrame::Raised</enum> | ||||
|      </property> | ||||
|      <widget class="QLineEdit" name="lineEdit"> | ||||
|       <property name="geometry"> | ||||
|        <rect> | ||||
|         <x>10</x> | ||||
|         <y>10</y> | ||||
|         <width>281</width> | ||||
|         <height>21</height> | ||||
|        </rect> | ||||
|       </property> | ||||
|      </widget> | ||||
|     </widget> | ||||
|    </item> | ||||
|   </layout> | ||||
|  </widget> | ||||
|  <resources/> | ||||
|  <connections/> | ||||
| </ui> | ||||
|  | @ -1,4 +1,7 @@ | |||
| SET(CMAKE_AUTOMOC ON) | ||||
| 
 | ||||
| find_package(cppzmq REQUIRED) | ||||
| 
 | ||||
| add_compile_definitions(IS_HTTP_PROXY_INTERFACE) | ||||
| add_library(mitmproxy_plugin SHARED mitmproxy_network.cpp mitmproxy_network.h mitmproxy.json) | ||||
| target_include_directories(mitmproxy_plugin PRIVATE ../../include/) | ||||
|  |  | |||
|  | @ -22,6 +22,11 @@ void mitmproxyPlugin::reconnect() | |||
|     this->connect(); | ||||
| } | ||||
| 
 | ||||
| QString mitmproxyPlugin::getName() | ||||
| { | ||||
|     return QString("mitmproxy bridge"); | ||||
| } | ||||
| 
 | ||||
| void mitmproxyPlugin::process() | ||||
| { | ||||
|     connect(); | ||||
|  | @ -46,7 +51,7 @@ void mitmproxyPlugin::process() | |||
|             qDebug() << "received " << msg_type.c_str(); | ||||
|         } else if(msg_type == "response") { | ||||
|             qDebug() << "received " << msg_type.c_str(); | ||||
|             message(j); | ||||
|             emit message(j); | ||||
|         } else if(msg_type == "requestheaders") { | ||||
|             qDebug() << "received " << msg_type.c_str(); | ||||
|         } else if(msg_type == "request") { | ||||
|  | @ -55,8 +60,8 @@ void mitmproxyPlugin::process() | |||
|             qDebug() << "received " << msg_type.c_str(); | ||||
|         } else if(msg_type == "error") { | ||||
|             qDebug() << "received " << msg_type.c_str(); | ||||
| 
 | ||||
|             // websocket events
 | ||||
|             emit error("error received"); | ||||
|         } else if(msg_type == "websocket_handshake") { | ||||
|             qDebug() << "received " << msg_type.c_str(); | ||||
|         } else if(msg_type == "websocket_start") { | ||||
|  |  | |||
|  | @ -28,6 +28,8 @@ private: | |||
|     void reconnect(); | ||||
| 
 | ||||
| public: | ||||
|     //! name of the plugin
 | ||||
|     QString getName() override; | ||||
|     //! returns, whether the proxy is currently connected
 | ||||
|     bool connected() override; | ||||
|     //! disconnects the handle
 | ||||
|  |  | |||
|  | @ -15,13 +15,13 @@ bool http::ProxyHandler::loadPlugin(QObject *proxy) | |||
|     // TODO: get path from config or something
 | ||||
|     inst->path = "tcp://127.0.0.1:12345"; | ||||
|     QObject::connect(thread, SIGNAL (started()), proxy, SLOT (process())); | ||||
|     //QObject::connect(proxy, SIGNAL (error(QString)), this, SLOT (errorString(QString)));
 | ||||
|     //QObject::connect(proxy, SIGNAL (message(http::Flow)), current_session, SLOT (saveFlow(http::Flow)), Qt::QueuedConnection);
 | ||||
|     //QObject::connect(proxy, SIGNAL (message(http::Flow)), this, SLOT (updateHistory()), Qt::QueuedConnection);
 | ||||
|     QObject::connect(proxy, SIGNAL (error(QString)), this, SIGNAL (error(QString)), Qt::QueuedConnection); | ||||
|     QObject::connect(proxy, SIGNAL (message(http::Flow)), this, SIGNAL (message(http::Flow)), Qt::QueuedConnection); | ||||
| 
 | ||||
|     thread->start(); | ||||
| 
 | ||||
|     //proxies.insert({"foo", inst, thread});
 | ||||
|     auto name = inst->getName(); | ||||
|     proxies.insert({name, {inst, thread}}); | ||||
| 
 | ||||
|     return true; | ||||
| } | ||||
|  |  | |||
|  | @ -6,13 +6,19 @@ | |||
| 
 | ||||
| namespace http { | ||||
| 
 | ||||
| class ProxyHandler | ||||
| class ProxyHandler : public QObject | ||||
| { | ||||
|     Q_OBJECT | ||||
| private: | ||||
|     std::map<std::string, ProxyInterface*, QThread*> proxies; | ||||
|     std::map<QString, std::pair<ProxyInterface*, QThread*>> proxies; | ||||
| 
 | ||||
| public: | ||||
|     bool loadPlugin(QObject *proxy); | ||||
|     QStringList getProxies(); | ||||
| 
 | ||||
| signals: | ||||
|     void error(QString err); | ||||
|     void message(http::Flow flow); | ||||
| }; | ||||
| 
 | ||||
| } | ||||
|  |  | |||
							
								
								
									
										4
									
								
								test.sh
									
										
									
									
									
								
							
							
						
						
									
										4
									
								
								test.sh
									
										
									
									
									
								
							|  | @ -1,8 +1,8 @@ | |||
| #!/bin/sh | ||||
| 
 | ||||
| mitmdump -k -p 1878 -s mitmaddon/littlesnitch.py & | ||||
| mitmdump -k -p 1878 -s ./mitmaddon/bigsnitch.py & | ||||
| export mitmpid=$! | ||||
| ./build/littlesnitch & | ||||
| ./build/bin/bigsnitch & | ||||
| 
 | ||||
| sleep 5 | ||||
| curl -s -x http://localhost:1878 -k https://yolo.jetzt > /dev/null | ||||
|  |  | |||
|  | @ -1,8 +1,6 @@ | |||
| #define CATCH_CONFIG_MAIN | ||||
| #include <catch2/catch.hpp> | ||||
| 
 | ||||
| #include "networkthread.h" | ||||
| 
 | ||||
| TEST_CASE( "1 eq 1", "[test]" ) { | ||||
|     REQUIRE( 1 == 1 ); | ||||
| } | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue