├── .github └── workflows │ ├── centos6.yml │ ├── ubuntu1604.yml │ ├── ubuntu1804.yml │ └── ubuntu2004.yml ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── Vagrantfile ├── flags-LICENSE.txt ├── install.sh ├── scripts ├── deploy_amun.sh ├── deploy_conpot.sh ├── deploy_cowrie.sh ├── deploy_dionaea.sh ├── deploy_drupot.sh ├── deploy_elastichoney.sh ├── deploy_elastichoney_docker.sh ├── deploy_glastopf.sh ├── deploy_kippo-centos.sh ├── deploy_kippo.sh ├── deploy_kippo_as_juniper.sh ├── deploy_magenpot.sh ├── deploy_p0f.sh ├── deploy_shockpot.sh ├── deploy_shockpot_sinkhole.sh ├── deploy_snort.sh ├── deploy_suricata.sh ├── deploy_wordpot.sh ├── dionaea-mhn.dockerfile ├── disable_collector.sh ├── docker_entrypoint.sh ├── docker_expect.sh ├── docker_supervisord-mhn.conf ├── enable_collector.sh ├── enable_ufw.sh ├── install_elk.sh ├── install_elk_raw_hpfeeds.sh ├── install_honeymap.sh ├── install_hpfeeds-logger-arcsight.sh ├── install_hpfeeds-logger-json.sh ├── install_hpfeeds-logger-splunk.sh ├── install_hpfeeds.sh ├── install_mhnserver.sh ├── install_mhnserver_unattended.sh ├── install_mnemosyne.sh ├── install_mongo.sh ├── install_mongodb_rhel69.sh ├── install_mongodb_ub14.sh ├── install_mongodb_ub16.sh ├── install_mongodb_ub18.sh ├── install_python2.7.sh ├── install_splunk_universalforwarder.sh ├── install_sqlite.sh ├── install_supervisord.sh ├── proxy │ ├── README.md │ ├── proxy-iptables-rules.sh │ ├── proxy.rc │ └── setup-proxy.sh └── update_channels.sh ├── server ├── apikeys_migration.sh ├── collector.json.example ├── collector.py ├── collector_v2.py ├── config.py.template ├── generateconfig.py ├── initdatabase.py ├── manage.py ├── manual_password_reset.py ├── mhn.py ├── mhn │ ├── __init__.py │ ├── api │ │ ├── __init__.py │ │ ├── decorators.py │ │ ├── errors.py │ │ ├── models.py │ │ ├── tests.py │ │ └── views.py │ ├── auth │ │ ├── __init__.py │ │ ├── contextprocessors.py │ │ ├── errors.py │ │ ├── models.py │ │ └── views.py │ ├── common │ │ ├── __init__.py │ │ ├── clio.py │ │ ├── contextprocessors.py │ │ ├── ruleutils.py │ │ ├── templatetags.py │ │ ├── testcommon.py │ │ └── utils.py │ ├── constants.py │ ├── static │ │ ├── css │ │ │ ├── foundation.min.css │ │ │ └── normalize.css │ │ ├── dionaea.conf │ │ ├── hpfeeds.py │ │ ├── ihandlers.py │ │ ├── img │ │ │ ├── flags-iso │ │ │ │ └── shiny │ │ │ │ │ └── 64 │ │ │ │ │ ├── A1.png │ │ │ │ │ ├── A2.png │ │ │ │ │ ├── AD.png │ │ │ │ │ ├── AE.png │ │ │ │ │ ├── AF.png │ │ │ │ │ ├── AG.png │ │ │ │ │ ├── AI.png │ │ │ │ │ ├── AL.png │ │ │ │ │ ├── AM.png │ │ │ │ │ ├── AN.png │ │ │ │ │ ├── AO.png │ │ │ │ │ ├── AQ.png │ │ │ │ │ ├── AR.png │ │ │ │ │ ├── AS.png │ │ │ │ │ ├── AT.png │ │ │ │ │ ├── AU.png │ │ │ │ │ ├── AW.png │ │ │ │ │ ├── AX.png │ │ │ │ │ ├── AZ.png │ │ │ │ │ ├── BA.png │ │ │ │ │ ├── BB.png │ │ │ │ │ ├── BD.png │ │ │ │ │ ├── BE.png │ │ │ │ │ ├── BF.png │ │ │ │ │ ├── BG.png │ │ │ │ │ ├── BH.png │ │ │ │ │ ├── BI.png │ │ │ │ │ ├── BJ.png │ │ │ │ │ ├── BL.png │ │ │ │ │ ├── BM.png │ │ │ │ │ ├── BN.png │ │ │ │ │ ├── BO.png │ │ │ │ │ ├── BR.png │ │ │ │ │ ├── BS.png │ │ │ │ │ ├── BT.png │ │ │ │ │ ├── BW.png │ │ │ │ │ ├── BY.png │ │ │ │ │ ├── BZ.png │ │ │ │ │ ├── CA.png │ │ │ │ │ ├── CC.png │ │ │ │ │ ├── CD.png │ │ │ │ │ ├── CF.png │ │ │ │ │ ├── CG.png │ │ │ │ │ ├── CH.png │ │ │ │ │ ├── CI.png │ │ │ │ │ ├── CK.png │ │ │ │ │ ├── CL.png │ │ │ │ │ ├── CM.png │ │ │ │ │ ├── CN.png │ │ │ │ │ ├── CO.png │ │ │ │ │ ├── CR.png │ │ │ │ │ ├── CU.png │ │ │ │ │ ├── CV.png │ │ │ │ │ ├── CW.png │ │ │ │ │ ├── CX.png │ │ │ │ │ ├── CY.png │ │ │ │ │ ├── CZ.png │ │ │ │ │ ├── DE.png │ │ │ │ │ ├── DJ.png │ │ │ │ │ ├── DK.png │ │ │ │ │ ├── DM.png │ │ │ │ │ ├── DO.png │ │ │ │ │ ├── DZ.png │ │ │ │ │ ├── EC.png │ │ │ │ │ ├── EE.png │ │ │ │ │ ├── EG.png │ │ │ │ │ ├── EH.png │ │ │ │ │ ├── ER.png │ │ │ │ │ ├── ES.png │ │ │ │ │ ├── ET.png │ │ │ │ │ ├── EU.png │ │ │ │ │ ├── FI.png │ │ │ │ │ ├── FJ.png │ │ │ │ │ ├── FK.png │ │ │ │ │ ├── FM.png │ │ │ │ │ ├── FO.png │ │ │ │ │ ├── FR.png │ │ │ │ │ ├── GA.png │ │ │ │ │ ├── GB.png │ │ │ │ │ ├── GD.png │ │ │ │ │ ├── GE.png │ │ │ │ │ ├── GG.png │ │ │ │ │ ├── GH.png │ │ │ │ │ ├── GI.png │ │ │ │ │ ├── GL.png │ │ │ │ │ ├── GM.png │ │ │ │ │ ├── GN.png │ │ │ │ │ ├── GQ.png │ │ │ │ │ ├── GR.png │ │ │ │ │ ├── GS.png │ │ │ │ │ ├── GT.png │ │ │ │ │ ├── GU.png │ │ │ │ │ ├── GW.png │ │ │ │ │ ├── GY.png │ │ │ │ │ ├── HK.png │ │ │ │ │ ├── HN.png │ │ │ │ │ ├── HR.png │ │ │ │ │ ├── HT.png │ │ │ │ │ ├── HU.png │ │ │ │ │ ├── IC.png │ │ │ │ │ ├── ID.png │ │ │ │ │ ├── IE.png │ │ │ │ │ ├── IL.png │ │ │ │ │ ├── IM.png │ │ │ │ │ ├── IN.png │ │ │ │ │ ├── IQ.png │ │ │ │ │ ├── IR.png │ │ │ │ │ ├── IS.png │ │ │ │ │ ├── IT.png │ │ │ │ │ ├── JE.png │ │ │ │ │ ├── JM.png │ │ │ │ │ ├── JO.png │ │ │ │ │ ├── JP.png │ │ │ │ │ ├── KE.png │ │ │ │ │ ├── KG.png │ │ │ │ │ ├── KH.png │ │ │ │ │ ├── KI.png │ │ │ │ │ ├── KM.png │ │ │ │ │ ├── KN.png │ │ │ │ │ ├── KP.png │ │ │ │ │ ├── KR.png │ │ │ │ │ ├── KW.png │ │ │ │ │ ├── KY.png │ │ │ │ │ ├── KZ.png │ │ │ │ │ ├── LA.png │ │ │ │ │ ├── LB.png │ │ │ │ │ ├── LC.png │ │ │ │ │ ├── LI.png │ │ │ │ │ ├── LK.png │ │ │ │ │ ├── LR.png │ │ │ │ │ ├── LS.png │ │ │ │ │ ├── LT.png │ │ │ │ │ ├── LU.png │ │ │ │ │ ├── LV.png │ │ │ │ │ ├── LY.png │ │ │ │ │ ├── MA.png │ │ │ │ │ ├── MC.png │ │ │ │ │ ├── MD.png │ │ │ │ │ ├── ME.png │ │ │ │ │ ├── MF.png │ │ │ │ │ ├── MG.png │ │ │ │ │ ├── MH.png │ │ │ │ │ ├── MK.png │ │ │ │ │ ├── ML.png │ │ │ │ │ ├── MM.png │ │ │ │ │ ├── MN.png │ │ │ │ │ ├── MO.png │ │ │ │ │ ├── MP.png │ │ │ │ │ ├── MQ.png │ │ │ │ │ ├── MR.png │ │ │ │ │ ├── MS.png │ │ │ │ │ ├── MT.png │ │ │ │ │ ├── MU.png │ │ │ │ │ ├── MV.png │ │ │ │ │ ├── MW.png │ │ │ │ │ ├── MX.png │ │ │ │ │ ├── MY.png │ │ │ │ │ ├── MZ.png │ │ │ │ │ ├── NA.png │ │ │ │ │ ├── NC.png │ │ │ │ │ ├── NE.png │ │ │ │ │ ├── NF.png │ │ │ │ │ ├── NG.png │ │ │ │ │ ├── NI.png │ │ │ │ │ ├── NL.png │ │ │ │ │ ├── NO.png │ │ │ │ │ ├── NP.png │ │ │ │ │ ├── NR.png │ │ │ │ │ ├── NU.png │ │ │ │ │ ├── NZ.png │ │ │ │ │ ├── O1.png │ │ │ │ │ ├── OM.png │ │ │ │ │ ├── PA.png │ │ │ │ │ ├── PE.png │ │ │ │ │ ├── PF.png │ │ │ │ │ ├── PG.png │ │ │ │ │ ├── PH.png │ │ │ │ │ ├── PK.png │ │ │ │ │ ├── PL.png │ │ │ │ │ ├── PN.png │ │ │ │ │ ├── PR.png │ │ │ │ │ ├── PS.png │ │ │ │ │ ├── PT.png │ │ │ │ │ ├── PW.png │ │ │ │ │ ├── PY.png │ │ │ │ │ ├── QA.png │ │ │ │ │ ├── RO.png │ │ │ │ │ ├── RS.png │ │ │ │ │ ├── RU.png │ │ │ │ │ ├── RW.png │ │ │ │ │ ├── SA.png │ │ │ │ │ ├── SB.png │ │ │ │ │ ├── SC.png │ │ │ │ │ ├── SD.png │ │ │ │ │ ├── SE.png │ │ │ │ │ ├── SG.png │ │ │ │ │ ├── SH.png │ │ │ │ │ ├── SI.png │ │ │ │ │ ├── SK.png │ │ │ │ │ ├── SL.png │ │ │ │ │ ├── SM.png │ │ │ │ │ ├── SN.png │ │ │ │ │ ├── SO.png │ │ │ │ │ ├── SR.png │ │ │ │ │ ├── SS.png │ │ │ │ │ ├── ST.png │ │ │ │ │ ├── SV.png │ │ │ │ │ ├── SY.png │ │ │ │ │ ├── SZ.png │ │ │ │ │ ├── TC.png │ │ │ │ │ ├── TD.png │ │ │ │ │ ├── TF.png │ │ │ │ │ ├── TG.png │ │ │ │ │ ├── TH.png │ │ │ │ │ ├── TJ.png │ │ │ │ │ ├── TK.png │ │ │ │ │ ├── TL.png │ │ │ │ │ ├── TM.png │ │ │ │ │ ├── TN.png │ │ │ │ │ ├── TO.png │ │ │ │ │ ├── TR.png │ │ │ │ │ ├── TT.png │ │ │ │ │ ├── TV.png │ │ │ │ │ ├── TW.png │ │ │ │ │ ├── TZ.png │ │ │ │ │ ├── UA.png │ │ │ │ │ ├── UG.png │ │ │ │ │ ├── US.png │ │ │ │ │ ├── UY.png │ │ │ │ │ ├── UZ.png │ │ │ │ │ ├── VA.png │ │ │ │ │ ├── VC.png │ │ │ │ │ ├── VE.png │ │ │ │ │ ├── VG.png │ │ │ │ │ ├── VI.png │ │ │ │ │ ├── VN.png │ │ │ │ │ ├── VU.png │ │ │ │ │ ├── WF.png │ │ │ │ │ ├── WS.png │ │ │ │ │ ├── YE.png │ │ │ │ │ ├── YT.png │ │ │ │ │ ├── ZA.png │ │ │ │ │ ├── ZM.png │ │ │ │ │ ├── ZW.png │ │ │ │ │ ├── _abkhazia.png │ │ │ │ │ ├── _basque-country.png │ │ │ │ │ ├── _british-antarctic-territory.png │ │ │ │ │ ├── _commonwealth.png │ │ │ │ │ ├── _england.png │ │ │ │ │ ├── _gosquared.png │ │ │ │ │ ├── _kosovo.png │ │ │ │ │ ├── _mars.png │ │ │ │ │ ├── _nagorno-karabakh.png │ │ │ │ │ ├── _nato.png │ │ │ │ │ ├── _northern-cyprus.png │ │ │ │ │ ├── _olympics.png │ │ │ │ │ ├── _red-cross.png │ │ │ │ │ ├── _scotland.png │ │ │ │ │ ├── _somaliland.png │ │ │ │ │ ├── _south-ossetia.png │ │ │ │ │ ├── _united-nations.png │ │ │ │ │ ├── _unknown.png │ │ │ │ │ └── _wales.png │ │ │ ├── trash-24.png │ │ │ ├── tslogo.png │ │ │ └── unknown.png │ │ ├── js │ │ │ ├── main.js │ │ │ └── vendor │ │ │ │ ├── fastclick.js │ │ │ │ ├── foundation.min.js │ │ │ │ ├── jquery.js │ │ │ │ └── modernizr.js │ │ └── registration.txt │ ├── tasks │ │ ├── __init__.py │ │ └── rules.py │ ├── templates │ │ ├── auth │ │ │ └── reset-email.html │ │ ├── base.html │ │ ├── pagination.html │ │ ├── security │ │ │ └── login_user.html │ │ └── ui │ │ │ ├── add-sensor.html │ │ │ ├── attacks.html │ │ │ ├── chart.html │ │ │ ├── dashboard.html │ │ │ ├── feeds.html │ │ │ ├── honeymap.html │ │ │ ├── reset-password.html │ │ │ ├── reset-request.html │ │ │ ├── rule_sources_mgmt.html │ │ │ ├── rules.html │ │ │ ├── script.html │ │ │ ├── sensors.html │ │ │ └── settings.html │ └── ui │ │ ├── __init__.py │ │ ├── constants.py │ │ ├── utils.py │ │ └── views.py ├── migration_remove-hostname-and-name-uniq-constraints.sql └── requirements.txt └── vagrant-bootstrap.sh /.github/workflows/centos6.yml: -------------------------------------------------------------------------------- 1 | name: Centos 6 2 | 3 | # Controls when the workflow will run 4 | on: 5 | # Triggers the workflow on push or pull request events but only for the master branch 6 | push: 7 | branches: 8 | - master 9 | pull_request: 10 | branches: 11 | - master 12 | 13 | # Allows you to run this workflow manually from the Actions tab 14 | workflow_dispatch: 15 | 16 | jobs: 17 | vagrant-up: 18 | runs-on: macos-10.15 19 | 20 | steps: 21 | - uses: actions/checkout@v2 22 | 23 | - name: Cache Vagrant boxes 24 | uses: actions/cache@v2 25 | with: 26 | path: ~/.vagrant.d/boxes 27 | key: ${{ runner.os }}-vagrant-${{ hashFiles('Vagrantfile') }} 28 | restore-keys: | 29 | ${{ runner.os }}-vagrant- 30 | 31 | - name: Show Vagrant version 32 | run: vagrant --version 33 | 34 | - name: Run CentOS 6 35 | run: vagrant up centos6 --provision-with dependencies -------------------------------------------------------------------------------- /.github/workflows/ubuntu1604.yml: -------------------------------------------------------------------------------- 1 | name: Ubuntu 16.04 2 | 3 | # Controls when the workflow will run 4 | on: 5 | # Triggers the workflow on push or pull request events but only for the master branch 6 | push: 7 | branches: 8 | - master 9 | pull_request: 10 | branches: 11 | - master 12 | 13 | # Allows you to run this workflow manually from the Actions tab 14 | workflow_dispatch: 15 | 16 | jobs: 17 | vagrant-up: 18 | runs-on: macos-10.15 19 | 20 | steps: 21 | - uses: actions/checkout@v2 22 | 23 | - name: Cache Vagrant boxes 24 | uses: actions/cache@v2 25 | with: 26 | path: ~/.vagrant.d/boxes 27 | key: ${{ runner.os }}-vagrant-${{ hashFiles('Vagrantfile') }} 28 | restore-keys: | 29 | ${{ runner.os }}-vagrant- 30 | 31 | - name: Show Vagrant version 32 | run: vagrant --version 33 | 34 | - name: Run Ubuntu 16.04 35 | run: vagrant up ubuntu1604 --provision-with dependencies 36 | -------------------------------------------------------------------------------- /.github/workflows/ubuntu1804.yml: -------------------------------------------------------------------------------- 1 | name: Ubuntu 18.04 2 | 3 | # Controls when the workflow will run 4 | on: 5 | # Triggers the workflow on push or pull request events but only for the master branch 6 | push: 7 | branches: 8 | - master 9 | pull_request: 10 | branches: 11 | - master 12 | 13 | # Allows you to run this workflow manually from the Actions tab 14 | workflow_dispatch: 15 | 16 | jobs: 17 | install-mhn-dependencies: 18 | runs-on: ubuntu-18.04 19 | 20 | steps: 21 | - uses: actions/checkout@v2 22 | 23 | - name: Clone latest MHN 24 | run: | 25 | cd /opt/ 26 | sudo git clone https://github.com/pwnlandia/mhn.git 27 | 28 | - name: Install MHN dependencies 29 | run: | 30 | sudo apt update && sudo apt upgrade -y 31 | sudo apt install -y python-pip 32 | sudo pip install --upgrade pip 33 | sudo apt install apt-transport-https -y 34 | sudo apt install build-essential -y 35 | sudo apt remove mongo* -y 36 | # Default mongodb install needs to be removed: 37 | # https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu1804-README.md#databases 38 | 39 | - name: Install hpfeeds 40 | run: | 41 | cd /opt/mhn/scripts/ 42 | sudo ./install_hpfeeds.sh 43 | 44 | - name: Install mnemosyne 45 | run: | 46 | cd /opt/mhn/scripts/ 47 | sudo ./install_mnemosyne.sh 48 | 49 | - name: Install honeymap 50 | run: | 51 | cd /opt/mhn/scripts/ 52 | sudo ./install_honeymap.sh -------------------------------------------------------------------------------- /.github/workflows/ubuntu2004.yml: -------------------------------------------------------------------------------- 1 | name: Ubuntu 20.04 2 | 3 | # Controls when the workflow will run 4 | on: 5 | # Triggers the workflow on push or pull request events but only for the master branch 6 | push: 7 | branches: 8 | - master 9 | pull_request: 10 | branches: 11 | - master 12 | 13 | # Allows you to run this workflow manually from the Actions tab 14 | workflow_dispatch: 15 | 16 | jobs: 17 | install-mhn-dependencies: 18 | runs-on: ubuntu-20.04 19 | 20 | steps: 21 | - uses: actions/checkout@v2 22 | 23 | - name: Clone latest MHN 24 | run: | 25 | cd /opt/ 26 | sudo git clone https://github.com/pwnlandia/mhn.git 27 | 28 | - name: Install MHN dependencies 29 | run: | 30 | sudo apt update && sudo apt upgrade -y 31 | sudo apt install -y python-pip 32 | sudo pip install --upgrade pip 33 | sudo apt install apt-transport-https -y 34 | sudo apt install build-essential -y 35 | sudo apt remove mongo* -y 36 | # Default mongodb install needs to be removed: 37 | # https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu1804-README.md#databases 38 | 39 | - name: Install hpfeeds 40 | run: | 41 | cd /opt/mhn/scripts/ 42 | sudo ./install_hpfeeds.sh 43 | 44 | - name: Install mnemosyne 45 | run: | 46 | cd /opt/mhn/scripts/ 47 | sudo ./install_mnemosyne.sh 48 | 49 | - name: Install honeymap 50 | run: | 51 | cd /opt/mhn/scripts/ 52 | sudo ./install_honeymap.sh 53 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | server/config.py 3 | server/mhn.db 4 | server/mhn/static/mhn.rules 5 | server/mhn.log 6 | server/mhn/mhn.log 7 | 8 | *.swp 9 | *.log.* 10 | 11 | *test-mhn.db 12 | 13 | celerybeat-schedule 14 | celerybeat.pid 15 | 16 | honeypot/mhnclient.conf 17 | 18 | /.vagrant 19 | /env 20 | 21 | index.html* 22 | 23 | # Emacs 24 | *~ 25 | *# 26 | .#* 27 | 28 | .DS_Store 29 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:18.04 2 | MAINTAINER threatstream 3 | 4 | RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections 5 | RUN apt-get update && apt-get upgrade -y && apt-get install git wget gcc supervisor expect psmisc lsb-release -y 6 | RUN mkdir -p /opt/mhn /data/db /var/log/mhn /var/log/supervisor 7 | 8 | ADD ./ /opt/mhn/ 9 | ADD scripts/docker_supervisord-mhn.conf /etc/supervisor/conf.d/mhn.conf 10 | ADD scripts/docker_entrypoint.sh /entrypoint.sh 11 | 12 | RUN chmod a+x /entrypoint.sh /opt/mhn/scripts/docker_expect.sh /opt/mhn/install.sh 13 | RUN echo supervisorctl start mongod >> /opt/mhn/scripts/install_mongo.sh 14 | 15 | ENV SUPERUSER_EMAIL "root@localhost" 16 | ENV SUPERUSER_PASSWORD "password" 17 | ENV SERVER_BASE_URL "http://localhost:80" 18 | ENV HONEYMAP_URL "http://localhost:3000" 19 | ENV DEBUG_MODE "n" 20 | ENV SMTP_HOST "localhost" 21 | ENV SMTP_PORT "25" 22 | ENV SMTP_TLS "n" 23 | ENV SMTP_SSL "n" 24 | ENV SMTP_USERNAME "" 25 | ENV SMTP_PASSWORD "" 26 | ENV SMTP_SENDER "" 27 | ENV MHN_LOG "/var/log/mhn/mhn.log" 28 | 29 | EXPOSE 80 30 | EXPOSE 10000 31 | EXPOSE 3000 32 | EXPOSE 8089 33 | 34 | CMD ["/entrypoint.sh"] 35 | -------------------------------------------------------------------------------- /Vagrantfile: -------------------------------------------------------------------------------- 1 | # https://github.com/jonashackt/vagrant-github-actions 2 | Vagrant.configure("2") do |config| 3 | 4 | # Prevent SharedFoldersEnableSymlinksCreate errors 5 | config.vm.synced_folder ".", "/vagrant", disabled: true 6 | 7 | config.vm.define "ubuntu1604" do |ubuntu1604| 8 | 9 | ubuntu1604.vm.box = "generic/ubuntu1604" 10 | 11 | ubuntu1604.vm.provision "dependencies", type: "shell", run: "never" do |u16ds| 12 | $u16dscript = <<-SCRIPT 13 | sudo git clone https://github.com/pwnlandia/mhn.git /opt/mhn/ 14 | sudo apt update && sudo apt upgrade -y 15 | sudo apt install -y python-pip 16 | sudo pip install --upgrade pip 17 | sudo apt install apt-transport-https -y 18 | sudo apt install build-essential -y 19 | sudo apt remove mongo* -y 20 | cd /opt/mhn/scripts/ 21 | sudo ./install_hpfeeds.sh 22 | sudo ./install_mnemosyne.sh 23 | sudo ./install_honeymap.sh 24 | SCRIPT 25 | 26 | u16ds.inline = $u16dscript 27 | end 28 | 29 | ubuntu1604.vm.provision "shell", run: "never" do |u16s| 30 | $u16script = <<-SCRIPT 31 | sudo git clone https://github.com/pwnlandia/mhn.git /opt/mhn/ 32 | sudo bash /opt/mhn/install.sh 33 | SCRIPT 34 | 35 | u16s.inline = $u16script 36 | end 37 | end 38 | 39 | config.vm.define "ubuntu1804" do |ubuntu1804| 40 | 41 | ubuntu1804.vm.box = "generic/ubuntu1804" 42 | 43 | ubuntu1804.vm.provision :shell, inline: 'sudo git clone https://github.com/pwnlandia/mhn.git /opt/mhn/' 44 | ubuntu1804.vm.provision :shell, inline: 'sudo bash /opt/mhn/install.sh' 45 | end 46 | 47 | config.vm.define "centos6" do |centos6| 48 | 49 | centos6.vm.box = "generic/centos6" 50 | 51 | centos6.vm.provision "dependencies", type: "shell", run: "never" do |c6ds| 52 | $c6dscript = <<-'SCRIPT' 53 | sudo export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:$PATH 54 | sudo yum install git -y 55 | sudo git clone https://github.com/pwnlandia/mhn.git /opt/mhn/ 56 | cd /opt/mhn/scripts/ 57 | sudo yum repolist 58 | sudo yum grouplist | grep -i development 59 | sudo yum groupinfo mark install "Development Tools" 60 | sudo yum groupinfo mark convert "Development Tools" 61 | sudo yum groupinstall "Development Tools" -y 62 | sudo bash /opt/mhn/scripts/install_sqlite.sh 63 | sudo bash /opt/mhn/scripts/install_supervisord.sh 64 | sudo bash /opt/mhn/scripts/install_hpfeeds.sh 65 | sudo bash /opt/mhn/scripts/install_mnemosyne.sh 66 | sudo bash /opt/mhn/scripts/install_honeymap.sh 67 | SCRIPT 68 | c6ds.inline = $c6dscript 69 | end 70 | 71 | centos6.vm.provision "shell", run: "never" do |c6s| 72 | $c6script = <<-SCRIPT 73 | sudo yum install git -y 74 | sudo git clone https://github.com/pwnlandia/mhn.git /opt/mhn/ 75 | sudo bash /opt/mhn/install.sh 76 | SCRIPT 77 | 78 | c6s.inline = $c6script 79 | end 80 | end 81 | end 82 | -------------------------------------------------------------------------------- /flags-LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2013 Go Squared Ltd. http://www.gosquared.com/ 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /scripts/deploy_amun.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | set -x 5 | 6 | if [ $# -ne 2 ] 7 | then 8 | echo "Wrong number of arguments supplied." 9 | echo "Usage: $0 ." 10 | exit 1 11 | fi 12 | 13 | server_url=$1 14 | deploy_key=$2 15 | 16 | apt-get update 17 | apt-get -y install git python-pip supervisor 18 | 19 | # Get the Amun source 20 | cd /opt 21 | git clone https://github.com/zeroq/amun.git 22 | cd amun 23 | AMUN_HOME=/opt/amun 24 | 25 | # Configure Amun (disable vuln-http, too many false alarms here) 26 | sed -i 's/ip: 127.0.0.1/ip: 0.0.0.0/g' conf/amun.conf 27 | sed -i 's/ vuln-http,/# vuln-http,/g' conf/amun.conf 28 | sed -i $'s/log_modules:/log_modules:\\\n log-hpfeeds/g' conf/amun.conf 29 | 30 | # Register the sensor with the MHN server. 31 | wget $server_url/static/registration.txt -O registration.sh 32 | chmod 755 registration.sh 33 | # Note: this will export the HPF_* variables 34 | . ./registration.sh $server_url $deploy_key "amun" 35 | 36 | # Setup HPFeeds 37 | cat > /opt/amun/conf/log-hpfeeds.conf < /etc/supervisor/conf.d/amun.conf < ." 7 | exit 1 8 | fi 9 | 10 | server_url=$1 11 | deploy_key=$2 12 | 13 | echo "deb http://en.archive.ubuntu.com/ubuntu precise main multiverse" | sudo tee -a /etc/apt/sources.list 14 | apt-get update 15 | apt-get install -y git libmysqlclient-dev libsmi2ldbl snmp-mibs-downloader python-dev libevent-dev libxslt1-dev libxml2-dev python-pip python-mysqldb pkg-config libvirt-dev supervisor 16 | apt-get install -y zlib1g-dev # needed for Ubuntu 14.04 17 | pip install --upgrade distribute 18 | pip install virtualenv 19 | 20 | CONPOT_HOME=/opt/conpot 21 | mkdir -p $CONPOT_HOME 22 | cd $CONPOT_HOME 23 | virtualenv env 24 | . env/bin/activate 25 | pip install -U setuptools 26 | pip install -e git+https://github.com/pwnlandia/hpfeeds.git#egg=hpfeeds-dev 27 | pip install -e git+https://github.com/mushorg/conpot.git@Release_0.5.2#egg=conpot-dev 28 | pip install -e git+https://github.com/mushorg/modbus-tk.git#egg=modbus-tk 29 | 30 | # Register sensor with MHN server. 31 | wget $server_url/static/registration.txt -O registration.sh 32 | chmod 755 registration.sh 33 | # Note: this will export the HPF_* variables 34 | . ./registration.sh $server_url $deploy_key "conpot" 35 | 36 | cat > conpot.cfg < /etc/supervisor/conf.d/conpot.conf < ." 10 | exit 1 11 | fi 12 | 13 | apt-get update 14 | apt-get install -y python 15 | 16 | server_url=$1 17 | deploy_key=$2 18 | 19 | apt-get update 20 | apt-get -y install python-dev git supervisor authbind openssl python-virtualenv build-essential python-gmpy2 libgmp-dev libmpfr-dev libmpc-dev libssl-dev python-pip libffi-dev 21 | 22 | pip install -U supervisor 23 | /etc/init.d/supervisor start || true 24 | 25 | sed -i 's/#Port/Port/g' /etc/ssh/sshd_config 26 | sed -i 's/Port 22$/Port 2222/g' /etc/ssh/sshd_config 27 | service ssh restart 28 | useradd -d /home/cowrie -s /bin/bash -m cowrie -g users 29 | 30 | cd /opt 31 | git clone https://github.com/micheloosterhof/cowrie.git cowrie 32 | cd cowrie 33 | 34 | # Most recent known working version 35 | git checkout 34f8464 36 | 37 | # Config for requirements.txt 38 | cat > /opt/cowrie/requirements.txt <=17.1.0 40 | cryptography>=2.1 41 | configparser 42 | pyopenssl 43 | pyparsing 44 | packaging 45 | appdirs>=1.4.0 46 | pyasn1_modules 47 | attrs 48 | service_identity 49 | python-dateutil 50 | tftpy 51 | bcrypt 52 | EOF 53 | 54 | virtualenv cowrie-env #env name has changed to cowrie-env on latest version of cowrie 55 | source cowrie-env/bin/activate 56 | # without the following, i get this error: 57 | # Could not find a version that satisfies the requirement csirtgsdk (from -r requirements.txt (line 10)) (from versions: 0.0.0a5, 0.0.0a6, 0.0.0a5.linux-x86_64, 0.0.0a6.linux-x86_64, 0.0.0a3) 58 | pip install csirtgsdk==0.0.0a6 59 | pip install -r requirements.txt 60 | 61 | # Register sensor with MHN server. 62 | wget $server_url/static/registration.txt -O registration.sh 63 | chmod 755 registration.sh 64 | # Note: this will export the HPF_* variables 65 | . ./registration.sh $server_url $deploy_key "cowrie" 66 | 67 | cd etc 68 | cp cowrie.cfg.dist cowrie.cfg 69 | sed -i 's/hostname = svr04/hostname = server/g' cowrie.cfg 70 | sed -i 's/listen_endpoints = tcp:2222:interface=0.0.0.0/listen_endpoints = tcp:22:interface=0.0.0.0/g' cowrie.cfg 71 | sed -i 's/version = SSH-2.0-OpenSSH_6.0p1 Debian-4+deb7u2/version = SSH-2.0-OpenSSH_6.7p1 Ubuntu-5ubuntu1.3/g' cowrie.cfg 72 | sed -i 's/#\[output_hpfeeds\]/[output_hpfeeds]/g' cowrie.cfg 73 | sed -i '/\[output_hpfeeds\]/!b;n;cenabled = true' cowrie.cfg 74 | sed -i "s/#server = hpfeeds.mysite.org/server = $HPF_HOST/g" cowrie.cfg 75 | sed -i "s/#port = 10000/port = $HPF_PORT/g" cowrie.cfg 76 | sed -i "s/#identifier = abc123/identifier = $HPF_IDENT/g" cowrie.cfg 77 | sed -i "s/#secret = secret/secret = $HPF_SECRET/g" cowrie.cfg 78 | sed -i 's/#debug=false/debug=false/' cowrie.cfg 79 | cd .. 80 | 81 | chown -R cowrie:users /opt/cowrie/ 82 | touch /etc/authbind/byport/22 83 | chown cowrie /etc/authbind/byport/22 84 | chmod 770 /etc/authbind/byport/22 85 | 86 | # start.sh is deprecated on new Cowrie version and substituted by "bin/cowrie [start/stop/status]" 87 | sed -i 's/AUTHBIND_ENABLED=no/AUTHBIND_ENABLED=yes/' bin/cowrie 88 | sed -i 's/DAEMONIZE=""/DAEMONIZE="-n"/' bin/cowrie 89 | 90 | # Config for supervisor 91 | cat > /etc/supervisor/conf.d/cowrie.conf < ." 10 | exit 1 11 | fi 12 | 13 | server_url=$1 14 | deploy_key=$2 15 | 16 | # Install dependencies 17 | apt update 18 | apt --yes install \ 19 | git \ 20 | supervisor \ 21 | build-essential \ 22 | cmake \ 23 | check \ 24 | cython3 \ 25 | libcurl4-openssl-dev \ 26 | libemu-dev \ 27 | libev-dev \ 28 | libglib2.0-dev \ 29 | libloudmouth1-dev \ 30 | libnetfilter-queue-dev \ 31 | libnl-3-dev \ 32 | libpcap-dev \ 33 | libssl-dev \ 34 | libtool \ 35 | libudns-dev \ 36 | python3 \ 37 | python3-dev \ 38 | python3-bson \ 39 | python3-yaml \ 40 | python3-boto3 41 | 42 | git clone https://github.com/DinoTools/dionaea.git 43 | cd dionaea 44 | 45 | # Latest tested version with this install script 46 | git checkout baf25d6 47 | 48 | mkdir build 49 | cd build 50 | cmake -DCMAKE_INSTALL_PREFIX:PATH=/opt/dionaea .. 51 | 52 | make 53 | make install 54 | 55 | wget $server_url/static/registration.txt -O registration.sh 56 | chmod 755 registration.sh 57 | # Note: this will export the HPF_* variables 58 | . ./registration.sh $server_url $deploy_key "dionaea" 59 | 60 | cat > /opt/dionaea/etc/dionaea/ihandlers-enabled/hpfeeds.yaml < /etc/supervisor/conf.d/dionaea.conf < ." 8 | exit 1 9 | fi 10 | 11 | server_url=$1 12 | deploy_key=$2 13 | 14 | apt-get update 15 | apt-get -y install git supervisor 16 | 17 | #################################################################### 18 | # Install a decent version of golang 19 | if [ "$(uname -m)" == "x86_64" ] ; 20 | then 21 | GO_PACKAGE="go1.12.7.linux-amd64.tar.gz" 22 | elif [ "$(uname -m)" == "armv7l" ] || [ "$(uname -m)" == "armv6l" ]; 23 | then 24 | GO_PACKAGE="go1.12.7.linux-armv6l.tar.gz" 25 | else 26 | GO_PACKAGE="go1.12.7.linux-386.tar.gz" 27 | fi 28 | 29 | cd /usr/local/ 30 | wget https://storage.googleapis.com/golang/${GO_PACKAGE} 31 | tar zxf ${GO_PACKAGE} && rm ${GO_PACKAGE} 32 | 33 | cd /usr/bin/ 34 | for X in /usr/local/go/bin/*; 35 | do 36 | echo $X; 37 | ln -s $X; 38 | done 39 | #################################################################### 40 | 41 | export GO111MODULE=on 42 | 43 | # Get the drupot source 44 | cd /opt 45 | git clone https://github.com/d1str0/drupot.git 46 | cd drupot 47 | git checkout v0.2.4 48 | 49 | go build 50 | 51 | # Register the sensor with the MHN server. 52 | wget $server_url/static/registration.txt -O registration.sh 53 | chmod 755 registration.sh 54 | # Note: this will export the HPF_* variables 55 | . ./registration.sh $server_url $deploy_key "agave" 56 | 57 | cat > config.toml< /etc/supervisor/conf.d/drupot.conf < ." 8 | exit 1 9 | fi 10 | 11 | server_url=$1 12 | deploy_key=$2 13 | 14 | apt-get update 15 | apt-get -y install git golang supervisor 16 | 17 | 18 | # Get the elastichoney source 19 | cd /opt 20 | git clone https://github.com/pwnlandia/elastichoney.git 21 | cd elastichoney 22 | 23 | export GOPATH=/opt/elastichoney 24 | go get || true 25 | go build 26 | 27 | # Register the sensor with the MHN server. 28 | wget $server_url/static/registration.txt -O registration.sh 29 | chmod 755 registration.sh 30 | # Note: this will export the HPF_* variables 31 | . ./registration.sh $server_url $deploy_key "elastichoney" 32 | 33 | cat > config.json< /etc/supervisor/conf.d/elastichoney.conf < ." 8 | exit 1 9 | fi 10 | 11 | server_url=$1 12 | deploy_key=$2 13 | 14 | apt-get update 15 | apt-get -y install docker.io supervisor 16 | 17 | 18 | # Get the elastichoney docker image 19 | docker pull pwnlandia/elastichoney 20 | 21 | # Register the sensor with the MHN server. 22 | wget $server_url/static/registration.txt -O registration.sh 23 | chmod 755 registration.sh 24 | # Note: this will export the HPF_* variables 25 | . ./registration.sh $server_url $deploy_key "elastichoney" 26 | 27 | mkdir /opt/elastichoney 28 | cat > /opt/elastichoney/config.json< /etc/supervisor/conf.d/elastichoney.conf < ." 8 | exit 1 9 | fi 10 | 11 | server_url=$1 12 | deploy_key=$2 13 | 14 | apt update 15 | apt install -y git supervisor 16 | 17 | #################################################################### 18 | # Install a decent version of golang 19 | if [ "$(uname -m)" == "x86_64" ] ; 20 | then 21 | GO_PACKAGE="go1.12.6.linux-amd64.tar.gz" 22 | elif [ "$(uname -m)" == "armv7l" ] || [ "$(uname -m)" == "armv6l" ]; 23 | then 24 | GO_PACKAGE="go1.12.6.linux-armv6l.tar.gz" 25 | else 26 | GO_PACKAGE="go1.12.6.linux-386.tar.gz" 27 | fi 28 | 29 | cd /usr/local/ 30 | wget https://storage.googleapis.com/golang/${GO_PACKAGE} 31 | tar zxf ${GO_PACKAGE} && rm ${GO_PACKAGE} 32 | 33 | cd /usr/bin/ 34 | for X in /usr/local/go/bin/*; 35 | do 36 | echo $X; 37 | ln -s $X; 38 | done 39 | #################################################################### 40 | 41 | export GO111MODULE=on 42 | 43 | # Get the magenpot source 44 | cd /opt 45 | git clone https://github.com/trevorleake/magenpot.git 46 | cd magenpot 47 | git checkout b4f113b 48 | 49 | go build 50 | 51 | # Register the sensor with the MHN server. 52 | wget $server_url/static/registration.txt -O registration.sh 53 | chmod 755 registration.sh 54 | # Note: this will export the HPF_* variables 55 | . ./registration.sh $server_url $deploy_key "agave" 56 | 57 | cat > config.toml< /etc/supervisor/conf.d/magenpot.conf < ." 17 | exit 1 18 | fi 19 | 20 | fi 21 | 22 | compareint=$(echo "$INTERFACE" | wc -w) 23 | 24 | 25 | if [ "$INTERFACE" = "e*" ] || [ "$compareint" -ne 1 ] 26 | then 27 | echo "No Interface selectable, please provide manually." 28 | echo "Usage: $0 " 29 | exit 1 30 | fi 31 | 32 | 33 | server_url=$1 34 | deploy_key=$2 35 | 36 | apt update 37 | apt install -y git supervisor libpcap-dev libjansson-dev gcc 38 | 39 | # install p0f 40 | cd /opt 41 | git clone https://github.com/threatstream/p0f.git 42 | cd p0f 43 | git checkout origin/hpfeeds 44 | ./build.sh 45 | useradd -d /var/empty/p0f -M -r -s /bin/nologin p0f-user || true 46 | mkdir -p -m 755 /var/empty/p0f 47 | 48 | # Register the sensor with the MHN server. 49 | wget $server_url/static/registration.txt -O registration.sh 50 | chmod 755 registration.sh 51 | # Note: this will export the HPF_* variables 52 | . ./registration.sh $server_url $deploy_key "p0f" 53 | 54 | # Note: This will change the interface and the ip in the p0f config 55 | sed -i "/INTERFACE=/c\INTERFACE=$INTERFACE" /opt/p0f/p0f_wrapper.sh 56 | sed -i "/MY_ADDRESS=/c\MY_ADDRESS=\$(ip -f inet -o addr show \$INTERFACE|head -n 1|cut -d\\\ -f 7 | cut -d/ -f 1)" /opt/p0f/p0f_wrapper.sh 57 | 58 | 59 | cat > /etc/supervisor/conf.d/p0f.conf < ." 8 | exit 1 9 | fi 10 | 11 | server_url=$1 12 | deploy_key=$2 13 | 14 | apt-get update 15 | apt-get -y install git python-pip supervisor 16 | pip install virtualenv 17 | 18 | # Get the Shockpot source 19 | cd /opt 20 | git clone https://github.com/pwnlandia/shockpot.git 21 | cd shockpot 22 | 23 | virtualenv env 24 | . env/bin/activate 25 | pip install -r requirements.txt 26 | 27 | # Register sensor with MHN server. 28 | wget $server_url/static/registration.txt -O registration.sh 29 | chmod 755 registration.sh 30 | # Note: this will export the HPF_* variables 31 | . ./registration.sh $server_url $deploy_key "shockpot" 32 | 33 | cat > shockpot.conf< /etc/supervisor/conf.d/shockpot.conf < ." 8 | exit 1 9 | fi 10 | 11 | server_url=$1 12 | deploy_key=$2 13 | 14 | wget $server_url/static/registration.txt -O registration.sh 15 | chmod 755 registration.sh 16 | # Note: this will export the HPF_* variables 17 | . ./registration.sh $server_url $deploy_key "shockpot" 18 | 19 | apt-get update 20 | apt-get -y install git python-pip supervisor 21 | pip install virtualenv 22 | 23 | # Get the Shockpot source 24 | cd /opt 25 | git clone https://github.com/pwnlandia/shockpot.git 26 | cd shockpot 27 | 28 | virtualenv env 29 | . env/bin/activate 30 | pip install -r requirements.txt 31 | 32 | cat > shockpot.conf< template.html < 59 | PUT YOUR HTML HERE 60 | 61 | EOF 62 | 63 | # Config for supervisor. 64 | cat > /etc/supervisor/conf.d/shockpot.conf < ." 8 | exit 1 9 | fi 10 | 11 | server_url=$1 12 | deploy_key=$2 13 | 14 | apt-get update 15 | apt-get -y install git python-pip supervisor 16 | pip install virtualenv 17 | 18 | # Get the Wordpot source 19 | cd /opt 20 | git clone https://github.com/pwnlandia/wordpot.git 21 | cd wordpot 22 | 23 | virtualenv env 24 | . env/bin/activate 25 | pip install -r requirements.txt 26 | 27 | cp wordpot.conf wordpot.conf.bak 28 | sed -i '/HPFEEDS_.*/d' wordpot.conf 29 | sed -i "s/^HOST\s.*/HOST = '0.0.0.0'/" wordpot.conf 30 | 31 | # Register the sensor with the MHN server. 32 | wget $server_url/static/registration.txt -O registration.sh 33 | chmod 755 registration.sh 34 | # Note: this will export the HPF_* variables 35 | . ./registration.sh $server_url $deploy_key "wordpot" 36 | 37 | cat >> wordpot.conf < /etc/supervisor/conf.d/wordpot.conf < /usr/sbin/policy-rc.d && echo 'exit 101' >> /usr/sbin/policy-rc.d && chmod +x /usr/sbin/policy-rc.d && dpkg-divert --local --rename --add /sbin/initctl && cp -a /usr/sbin/policy-rc.d /sbin/initctl && sed -i 's/^exit.*/exit 0/' /sbin/initctl && echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup && echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean && echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean && echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean && echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages && echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes 3 | RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list 4 | CMD ["/bin/bash"] 5 | MAINTAINER MO 6 | RUN echo "deb http://ppa.launchpad.net/honeynet/nightly/ubuntu trusty main" >> /etc/apt/sources.list 7 | RUN echo "deb-src http://ppa.launchpad.net/honeynet/nightly/ubuntu trusty main" >> /etc/apt/sources.list 8 | RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys FC8C70BBE667E4FB0F42916511C832A6A6131AE4 9 | RUN apt-get update -y 10 | RUN apt-get dist-upgrade -y 11 | ENV DEBIAN_FRONTEND=noninteractive 12 | RUN apt-get install -y supervisor dionaea-phibo 13 | RUN addgroup --gid 2000 tpot 14 | RUN adduser --system --no-create-home --shell /bin/bash --uid 2000 --disabled-password --disabled-login --gid 2000 tpot 15 | RUN mkdir -p /data/dionaea/log /data/dionaea/bistreams /data/dionaea/binaries /data/dionaea/rtp /data/dionaea/wwwroot 16 | RUN chmod 760 -R /data && chown tpot:tpot -R /data 17 | ADD file:c52313552816a4661d6928d9102dc9923a0b8bf5b7251d077ff32cfa46c71207 in /etc/dionaea/ 18 | ADD file:ba6acab3f003807d8d5c2f7ef00fb7b5ece71da6ad51524f25f8a522146d7ddb in /etc/supervisor/conf.d/supervisord.conf 19 | RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 20 | CMD ["/usr/bin/supervisord"] 21 | -------------------------------------------------------------------------------- /scripts/disable_collector.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | sudo sed -i'' 's/autostart=true/autostart=false/g' /etc/supervisor/conf.d/mhn-collector.conf 4 | sudo sed -i'' 's/autorestart=true/autorestart=false/g' /etc/supervisor/conf.d/mhn-collector.conf 5 | sudo supervisorctl update 6 | 7 | -------------------------------------------------------------------------------- /scripts/docker_entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ ! -f /opt/mhn/install_done ]; then 4 | echo "Running setup" 5 | sed -i 's/\[supervisord\]/\[supervisord\]\r\nnodaemon=true/g' /etc/supervisor/supervisord.conf 6 | /usr/bin/supervisord -c /etc/supervisor/supervisord.conf& 7 | 8 | sed -i "s|SUPERUSER_EMAIL|"$SUPERUSER_EMAIL"|g" /opt/mhn/scripts/docker_expect.sh 9 | sed -i "s|SUPERUSER_PASSWORD|"$SUPERUSER_PASSWORD"|g" /opt/mhn/scripts/docker_expect.sh 10 | sed -i "s|SERVER_BASE_URL|"$SERVER_BASE_URL"|g" /opt/mhn/scripts/docker_expect.sh 11 | sed -i "s|HONEYMAP_URL|"$HONEYMAP_URL"|g" /opt/mhn/scripts/docker_expect.sh 12 | sed -i "s|DEBUG_MODE|"$DEBUG_MODE"|g" /opt/mhn/scripts/docker_expect.sh 13 | sed -i "s|SMTP_HOST|"$SMTP_HOST"|g" /opt/mhn/scripts/docker_expect.sh 14 | sed -i "s|SMTP_PORT|"$SMTP_PORT"|g" /opt/mhn/scripts/docker_expect.sh 15 | sed -i "s|SMTP_TLS|"$SMTP_TLS"|g" /opt/mhn/scripts/docker_expect.sh 16 | sed -i "s|SMTP_SSL|"$SMTP_SSL"|g" /opt/mhn/scripts/docker_expect.sh 17 | sed -i "s|SMTP_USERNAME|"$SMTP_USERNAME"|g" /opt/mhn/scripts/docker_expect.sh 18 | sed -i "s|SMTP_PASSWORD|"$SMTP_PASSWORD"|g" /opt/mhn/scripts/docker_expect.sh 19 | sed -i "s|SMTP_SENDER|"$SMTP_SENDER"|g" /opt/mhn/scripts/docker_expect.sh 20 | sed -i "s|MHN_LOG|"$MHN_LOG"|g" /opt/mhn/scripts/docker_expect.sh 21 | 22 | /opt/mhn/scripts/docker_expect.sh 23 | 24 | sed -i 's/\[supervisord\]/\[supervisord\]\r\nnodaemon=true/g' /etc/supervisor/supervisord.conf 25 | sed -i 's/autostart=false/autostart=true/g' /etc/supervisor/conf.d/mhn.conf 26 | 27 | touch /opt/mhn/install_done 28 | 29 | supervisorctl stop all 30 | pkill -f supervisord 31 | pkill -f nginx 32 | fi 33 | /usr/bin/supervisord -c /etc/supervisor/supervisord.conf -------------------------------------------------------------------------------- /scripts/docker_expect.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/expect -f 2 | set timeout 5000 3 | spawn /opt/mhn/install.sh 4 | expect "Do you wish to run in Debug mode?: y/n" 5 | send "DEBUG_MODE\r" 6 | expect "Superuser email:" 7 | send "SUPERUSER_EMAIL\r" 8 | expect "Superuser password:" 9 | send "SUPERUSER_PASSWORD\r" 10 | expect "Superuser password: (again):" 11 | send "SUPERUSER_PASSWORD\r" 12 | expect "Server base url" 13 | send "SERVER_BASE_URL\r" 14 | expect "Honeymap url" 15 | send "HONEYMAP_URL\r" 16 | expect "Mail server address" 17 | send "SMTP_HOST\r" 18 | expect "Mail server port" 19 | send "SMTP_PORT\r" 20 | expect "Use TLS for email?: y/n" 21 | send "SMTP_TLS\r" 22 | expect "Use SSL for email?: y/n" 23 | send "SMTP_SSL\r" 24 | expect "Mail server username" 25 | send "SMTP_USERNAME\r" 26 | expect "Mail server password" 27 | send "SMTP_PASSWORD\r" 28 | expect "Mail default sender" 29 | send "SMTP_SENDER\r" 30 | expect "Path for log file" 31 | send "MHN_LOG\r" 32 | expect "Would you like to integrate with Splunk?" 33 | send "n\r" 34 | expect "Would you like to install ELK?" 35 | send "n\r" 36 | expect "Would you like to add MHN rules to UFW?" 37 | send "n\r" 38 | expect EOF -------------------------------------------------------------------------------- /scripts/docker_supervisord-mhn.conf: -------------------------------------------------------------------------------- 1 | [program:mongod] 2 | command=/usr/bin/mongod 3 | stdout_logfile=/var/log/supervisor/%(program_name)s.log 4 | stderr_logfile=/var/log/supervisor/%(program_name)s.log 5 | autorestart=true 6 | autostart=false 7 | 8 | [program:nginx] 9 | command=/usr/sbin/nginx -g "daemon off;" 10 | stdout_events_enabled=true 11 | stderr_events_enabled=true 12 | autostart=false 13 | autorestart=true -------------------------------------------------------------------------------- /scripts/enable_collector.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | sudo sed -i'' 's/autostart=false/autostart=true/g' /etc/supervisor/conf.d/mhn-collector.conf 4 | sudo sed -i'' 's/autorestart=false/autorestart=true/g' /etc/supervisor/conf.d/mhn-collector.conf 5 | sudo supervisorctl update 6 | 7 | -------------------------------------------------------------------------------- /scripts/enable_ufw.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Check if Ubuntu 18.04 or 16.04 4 | if [ "$(lsb_release -r -s)" != "18.04" ] && [ "$(lsb_release -r -s)" != "16.04" ]; then 5 | echo "WARNING: This operating system may not be supported by this script." 6 | echo "Continue? (y/n)" 7 | read PROMPT 8 | if [ "$PROMPT" == "n" -o "$PROMPT" == "N" ] 9 | then 10 | exit 11 | fi 12 | fi 13 | 14 | ufw allow https 15 | ufw allow http 16 | ufw allow ssh 17 | ufw allow 3000 18 | ufw allow 10000 19 | 20 | while true; 21 | do 22 | echo "WARNING: If SSH port (22) is incorrect you may lock yourself out." 23 | echo "Do you want to enable UFW? (y/n) " 24 | read UFW 25 | if [ "$UFW" == "y" -o "$UFW" == "Y" ] 26 | then 27 | ufw enable 28 | ufw status 29 | break 30 | elif [ "$UFW" == "n" -o "$UFW" == "N" ] 31 | then 32 | ufw disable 33 | echo "UFW configured but disabled." 34 | echo "Please correct and verify firewall rules before enabling UFW with:" 35 | echo " sudo ufw enable" 36 | break 37 | fi 38 | done 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /scripts/install_hpfeeds-logger-arcsight.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | set -x 5 | 6 | apt-get update 7 | apt-get install -y git python-pip python-dev libgeoip-dev 8 | pip install virtualenv 9 | 10 | SCRIPTS=`dirname $0` 11 | 12 | if [ ! -d "/opt/hpfeeds-logger" ] 13 | then 14 | cd /opt/ 15 | virtualenv hpfeeds-logger 16 | . hpfeeds-logger/bin/activate 17 | pip install hpfeeds-logger==0.0.7.7 18 | else 19 | echo "It looks like hpfeeds-logger is already installed. Moving on to configuration." 20 | fi 21 | 22 | IDENT=hpfeeds-logger-arcsight 23 | SECRET=`python -c 'import uuid;print str(uuid.uuid4()).replace("-","")'` 24 | CHANNELS='amun.events,dionaea.connections,dionaea.capture,glastopf.events,beeswarm.hive,kippo.sessions,cowrie.sessions,conpot.events,snort.alerts,suricata.events,wordpot.events,shockpot.events,p0f.events,elastichoney.events' 25 | 26 | cat > /opt/hpfeeds-logger/arcsight.json <> /etc/supervisor/conf.d/hpfeeds-logger-arcsight.conf < /opt/hpfeeds-logger/json.json <> /etc/supervisor/conf.d/hpfeeds-logger-json.conf < /opt/hpfeeds-logger/splunk.json <> /etc/supervisor/conf.d/hpfeeds-logger-splunk.conf <> /etc/supervisor/conf.d/hpfeeds-broker.conf < /opt/mnemosyne/mnemosyne.cfg <> /etc/supervisor/conf.d/mnemosyne.conf <> /etc/yum.repos.d/mongodb.repo < /etc/systemd/system/mongodb.service < " 20 | exit 1 21 | fi 22 | 23 | cd /tmp/ 24 | 25 | VERSION="6.2.3" 26 | if [ "$(uname -m)" == "x86_64" ] ; 27 | then 28 | FILENAME="splunkforwarder-6.2.3-264376-linux-2.6-amd64.deb" 29 | ARCH="x86_64" 30 | else 31 | FILENAME="splunkforwarder-6.2.3-264376-linux-2.6-intel.deb" 32 | ARCH="x86" 33 | fi 34 | rm -f "${FILENAME}" 35 | wget -O "${FILENAME}" "http://www.splunk.com/bin/splunk/DownloadActivityServlet?architecture=${ARCH}&platform=Linux&version=${VERSION}&product=universalforwarder&filename=${FILENAME}&wget=true" 36 | dpkg -i "${FILENAME}" 37 | 38 | SPLUNK="/opt/splunkforwarder/bin/splunk" 39 | 40 | $SPLUNK start --accept-license 41 | $SPLUNK enable boot-start 42 | $SPLUNK add forward-server "${SPLUNK_HOST}:${SPLUNK_PORT}" -auth admin:changeme 43 | $SPLUNK add monitor /var/log/mhn/ 44 | 45 | echo "splunkforwarder installed and configured to monitor /var/log/mhn/" 46 | echo "It is highly recommended that you change the password for this local splunk install" 47 | 48 | # might want to do this... 49 | # splunk add forward-server : -ssl-cert-path /path/ssl.crt -ssl-root-ca-path /path/ca.crt -ssl-password 50 | -------------------------------------------------------------------------------- /scripts/install_sqlite.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e 4 | set -x 5 | SCRIPTS=`dirname "$(readlink -f "$0")"` 6 | MHN_HOME=$SCRIPTS/.. 7 | 8 | if [ -f /etc/debian_version ]; then 9 | OS=Debian # XXX or Ubuntu?? 10 | apt-get update 11 | apt-get -y install sqlite 12 | exit 0 13 | 14 | elif [ -f /etc/redhat-release ]; then 15 | OS=RHEL 16 | export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:$PATH 17 | yum -y update 18 | yum -y install epel-release wget 19 | yum -y groupinstall "Development tools" 20 | 21 | wget https://sqlite.org/2016/sqlite-autoconf-3100100.tar.gz --no-check-certificate 22 | tar -xvzf sqlite-autoconf-3100100.tar.gz 23 | cd sqlite-autoconf-3100100 24 | ./configure 25 | make && make install 26 | 27 | ldconfig /usr/local/lib/ 28 | ldconfig /usr/lib64/qt4/plugins/sqldrivers 29 | else 30 | echo -e "Unknown OS. Exiting" 31 | exit -1 32 | 33 | fi 34 | -------------------------------------------------------------------------------- /scripts/install_supervisord.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e 4 | set -x 5 | SCRIPTS=`dirname "$(readlink -f "$0")"` 6 | MHN_HOME=$SCRIPTS/.. 7 | 8 | if [ -f /etc/debian_version ]; then 9 | OS=Debian # XXX or Ubuntu?? 10 | apt-get update 11 | apt-get -y install supervisor 12 | 13 | elif [ -f /etc/redhat-release ]; then 14 | OS=RHEL 15 | export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:$PATH 16 | #install python2.7 if it isn't installed 17 | if [ ! -f /usr/local/bin/python2.7 ]; then 18 | $SCRIPTS/install_python2.7.sh 19 | fi 20 | 21 | if [ ! -f /usr/local/bin/pip2.7 ]; then 22 | $SCRIPTS/install_python2.7.sh 23 | fi 24 | 25 | #use python2.7/pip2.7 26 | PYTHON=/usr/local/bin/python2.7 27 | PIP=/usr/local/bin/pip2.7 28 | 29 | if [ ! -f /usr/local/bin/virtualenv ]; then 30 | $PIP install virtualenv 31 | VIRTUALENV=/usr/local/bin/virtualenv 32 | fi 33 | 34 | if [ -f /usr/local/bin/supervisord ]; then 35 | echo "Supervisord Already installed. Exiting" 36 | exit 0 37 | fi 38 | 39 | #install supervisor from pip2.7 40 | mkdir -p /etc/supervisor 41 | mkdir -p /etc/supervisor/conf.d 42 | $PIP install supervisor 43 | 44 | echo_supervisord_conf > /etc/supervisord.conf 45 | 46 | cat >> /etc/supervisord.conf < ] 19,352 56.1K/s in 0.3s 47 | 48 | 2014-07-08 18:24:04 (56.1 KB/s) - “index.html” saved [19352] 49 | 50 | 51 | Clearing the iptables rules (in case of needing to install packages, etc) 52 | 53 | sudo iptables -F 54 | 55 | -------------------------------------------------------------------------------- /scripts/proxy/proxy-iptables-rules.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # clear out any old rules so this is idempotent 4 | iptables --flush 5 | iptables --table nat --flush 6 | 7 | iptables --append INPUT --in-interface eth0 --proto tcp --dport 1:21 --jump DROP 8 | iptables --append INPUT --in-interface eth0 --proto tcp --dport 23:1024 --jump DROP 9 | 10 | # allow 22 11 | for PORT in 3000 8000 8080 8098 9001 11211; do 12 | iptables --append INPUT --in-interface eth0 --proto tcp --sport $PORT --jump DROP 13 | done 14 | 15 | # print out current rules to check correctness 16 | iptables --list --numeric 17 | -------------------------------------------------------------------------------- /scripts/proxy/proxy.rc: -------------------------------------------------------------------------------- 1 | # proxy settings for Vagrant setup (Squid is running on the proxy VM) 2 | PROXY=http://10.254.253.102:3128 3 | export http_proxy=$PROXY 4 | export https_proxy=$PROXY 5 | export HTTP_PROXY=$PROXY 6 | export HTTPS_PROXY=$PROXY 7 | export no_proxy="localhost,127.0.0.1,127.0.1.1" 8 | -------------------------------------------------------------------------------- /scripts/proxy/setup-proxy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | sudo apt-get -y update 4 | sudo apt-get install -y squid3 5 | 6 | cat > /etc/squid3/squid.conf.allow_all < /etc/squid3/squid.conf.deny_all < 1: 41 | logger.info("Parsing config file: %s"%sys.argv[1]) 42 | cfg.update(json.load(file(sys.argv[1]))) 43 | 44 | for name,value in cfg.items(): 45 | if isinstance(value, basestring): 46 | # hpfeeds protocol has trouble with unicode, hence the utf-8 encoding here 47 | cfg[name] = value.encode("utf-8") 48 | else: 49 | logger.warning("Warning: no config found, using default values for hpfeeds server") 50 | 51 | subscriber = hpfeeds_connect(cfg['HOST'], cfg['PORT'], cfg['IDENT'], cfg['SECRET']) 52 | publisher = hpfeeds_connect(cfg['RHOST'], cfg['RPORT'], cfg['RIDENT'], cfg['RSECRET']) 53 | 54 | def on_message(identifier, channel, payload): 55 | try: 56 | # validate JSON 57 | payload = str(payload) 58 | rec = json.loads(payload) 59 | 60 | # send payload (only if its JSON validation passed) 61 | publisher.publish(cfg['RCHANNEL'], payload) 62 | except Exception as e: 63 | logger.exception(e) 64 | pass 65 | 66 | def on_error(payload): 67 | logger.error(' -> errormessage from server: {0}'.format(payload)) 68 | subscriber.stop() 69 | publisher.stop() 70 | 71 | subscriber.subscribe([cfg['GEOLOC_CHAN']]) 72 | try: 73 | subscriber.run(on_message, on_error) 74 | except hpfeeds.FeedException, e: 75 | logger.error('feed exception: %s'%e) 76 | except KeyboardInterrupt: 77 | pass 78 | except: 79 | import traceback 80 | traceback.print_exc() 81 | finally: 82 | subscriber.close() 83 | publisher.close() 84 | return 0 85 | 86 | if __name__ == '__main__': 87 | try: 88 | sys.exit(main()) 89 | except KeyboardInterrupt: 90 | sys.exit(0) 91 | -------------------------------------------------------------------------------- /server/config.py.template: -------------------------------------------------------------------------------- 1 | """ 2 | Template to create config.py file. 3 | Do not add 'config.py' to SCM. 4 | """ 5 | 6 | import os 7 | from celery.schedules import crontab 8 | 9 | 10 | _basedir = os.path.abspath(os.path.dirname(__file__)) 11 | 12 | MHN_SERVER_HOME = _basedir 13 | 14 | # Local settings. 15 | DEBUG = {{DEBUG}} 16 | SECRET_KEY = '{{SECRET_KEY}}' 17 | SUPERUSER_EMAIL = '{{SUPERUSER_EMAIL}}' 18 | SUPERUSER_PASSWORD = '{{SUPERUSER_PASSWORD}}' 19 | SERVER_BASE_URL = '{{SERVER_BASE_URL}}' 20 | HONEYMAP_URL = '{{HONEYMAP_URL}}' 21 | DEPLOY_KEY = '{{DEPLOY_KEY}}' 22 | LOG_FILE_PATH = '{{LOG_FILE_PATH}}' 23 | 24 | MAIL_SERVER = '{{MAIL_SERVER}}' 25 | MAIL_PORT = {{MAIL_PORT}} 26 | MAIL_USE_TLS = {{MAIL_USE_TLS}} 27 | MAIL_USE_SSL = {{MAIL_USE_SSL}} 28 | MAIL_USERNAME = '{{MAIL_USERNAME}}' 29 | MAIL_PASSWORD = '{{MAIL_PASSWORD}}' 30 | DEFAULT_MAIL_SENDER = '{{DEFAULT_MAIL_SENDER}}' 31 | MAIL_DEBUG = DEBUG 32 | 33 | # Other settings. 34 | FEED_AUTH_REQUIRED = False 35 | SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(_basedir, 'mhn.db') 36 | SQLALCHEMY_TRACK_MODIFICATIONS = False 37 | SECURITY_PASSWORD_HASH = 'bcrypt' 38 | SECURITY_PASSWORD_SALT = SECRET_KEY 39 | SECURITY_LOGIN_URL = '/ui/login/' 40 | BROKER_URL = 'redis://localhost:6379' 41 | CELERY_RESULT_BACKEND = BROKER_URL 42 | RENDERED_RULES_PATH = os.path.join(_basedir, 'mhn/static/mhn.rules') 43 | CELERYBEAT_SCHEDULE = { 44 | 'fetch-emerging-rules': { 45 | 'task': 'mhn.tasks.rules.fetch_sources', 46 | 'schedule': crontab(hour=12), 47 | 'args': () 48 | } 49 | } 50 | SNORT_RULES_SOURCE = { 51 | 'name': 'Emerging Threats', 52 | 'uri': 'https://rules.emergingthreats.net/open/snort-2.9.0/emerging.rules.tar.gz' 53 | } 54 | HONEYPOT_CHANNELS = { 55 | 'dionaea': [ 56 | 'mwbinary.dionaea.sensorunique', 57 | 'dionaea.capture', 58 | 'dionaea.capture.anon', 59 | 'dionaea.caputres', 60 | 'dionaea.connections' 61 | ], 62 | 'conpot': ['conpot.events'], 63 | 'snort': ['snort.alerts'], 64 | 'kippo': ['kippo.sessions'], 65 | 'cowrie': ['cowrie.sessions'], 66 | 'thug': ['thug.files', 'thug.events'], 67 | 'glastopf': ['glastopf.files', 'glastopf.events'], 68 | 'amun': ['amun.events'], 69 | 'wordpot': ['wordpot.events'], 70 | 'shockpot': ['shockpot.events'], 71 | 'p0f': ['p0f.events'], 72 | 'suricata': ['suricata.events'], 73 | 'elastichoney': ['elastichoney.events'], 74 | 'drupot': ['drupot.events'], 75 | 'agave': ['agave.events'], 76 | } 77 | -------------------------------------------------------------------------------- /server/initdatabase.py: -------------------------------------------------------------------------------- 1 | from mhn import create_clean_db 2 | 3 | 4 | if __name__ == '__main__': 5 | create_clean_db() 6 | -------------------------------------------------------------------------------- /server/manage.py: -------------------------------------------------------------------------------- 1 | import os 2 | from urlparse import urlparse 3 | 4 | from flask.ext.script import Manager 5 | from flask.ext.migrate import Migrate, MigrateCommand 6 | 7 | try: 8 | import config 9 | except ImportError: 10 | print 'It seems like this is the first time running the server.' 11 | print 'First let us generate a proper configuration file.' 12 | try: 13 | from generateconfig import generate_config 14 | generate_config() 15 | import config 16 | from mhn import create_clean_db 17 | print 'Initializing database "{}".'.format(config.SQLALCHEMY_DATABASE_URI) 18 | create_clean_db() 19 | except Exception as e: 20 | print e 21 | print 'An error ocurred. Please fix the errors and try again.' 22 | print 'Deleting "config.py" file.' 23 | try: 24 | os.remove('config.py') 25 | os.remove('config.pyc') 26 | finally: 27 | raise SystemExit('Exiting now.') 28 | 29 | from mhn import mhn, db 30 | from mhn.tasks.rules import fetch_sources 31 | 32 | 33 | if __name__ == '__main__': 34 | migrate = Migrate(mhn, db) 35 | manager = Manager(mhn) 36 | manager.add_command('db', MigrateCommand) 37 | 38 | @manager.command 39 | def run(): 40 | # Takes run parameters from configuration. 41 | serverurl = urlparse(config.SERVER_BASE_URL) 42 | os.system('celery -A mhn.tasks --config=config beat &') 43 | os.system('celery -A mhn.tasks --config=config worker &') 44 | mhn.run(debug=config.DEBUG, host='0.0.0.0', 45 | port=serverurl.port) 46 | 47 | @manager.command 48 | def runlocal(): 49 | serverurl = urlparse(config.SERVER_BASE_URL) 50 | mhn.run(debug=config.DEBUG, host='0.0.0.0', 51 | port=serverurl.port) 52 | 53 | @manager.command 54 | def fetch_rules(): 55 | fetch_sources() 56 | 57 | manager.run() 58 | -------------------------------------------------------------------------------- /server/manual_password_reset.py: -------------------------------------------------------------------------------- 1 | from flask_security.utils import encrypt_password 2 | from mhn.auth.models import User 3 | from mhn import mhn, db 4 | import sys 5 | from getpass import getpass 6 | 7 | with mhn.test_request_context(): 8 | email = raw_input("Enter email address: ").strip() 9 | 10 | password = getpass("Enter new password: ") 11 | password2 = getpass("Enter new password (again): ") 12 | 13 | if password != password2: 14 | print "Passwords didn't match, try again" 15 | sys.exit(1) 16 | 17 | user = User.query.filter_by(email=email).first() 18 | if user: 19 | print "user found, updating password" 20 | user.password = encrypt_password(password) 21 | db.session.add(user) 22 | db.session.commit() 23 | else: 24 | print "No user with that email address was found." 25 | 26 | 27 | -------------------------------------------------------------------------------- /server/mhn.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | 4 | if __name__ == '__main__': 5 | from mhn import mhn 6 | mhn.run(debug=False, host='0.0.0.0', port=8000) 7 | -------------------------------------------------------------------------------- /server/mhn/api/__init__.py: -------------------------------------------------------------------------------- 1 | class APIModel(object): 2 | @classmethod 3 | def fields(cls): 4 | return cls.all_fields.keys() 5 | 6 | @classmethod 7 | def editable_fields(cls): 8 | return cls._make_field_list('editable') 9 | 10 | @classmethod 11 | def required_fields(cls): 12 | return cls._make_field_list('required') 13 | 14 | @classmethod 15 | def _make_field_list(cls, prop): 16 | """ 17 | Returns a list of field names that have the property 18 | `prop` in the `all_fields` dictionary defined at 19 | class level. 20 | """ 21 | return [f for f, e in cls.all_fields.items() if e.get(prop, False)] 22 | 23 | @classmethod 24 | def check_required(cls, payload): 25 | """ 26 | Returns a list of required fields that are 27 | missing from the dictionary object `payload`. 28 | """ 29 | missing = [] 30 | for field in cls.required_fields(): 31 | if (field not in payload) or payload.get(field) == '': 32 | missing.append(field) 33 | return missing 34 | 35 | -------------------------------------------------------------------------------- /server/mhn/api/decorators.py: -------------------------------------------------------------------------------- 1 | from functools import wraps 2 | 3 | from flask import request, current_app 4 | 5 | from mhn.api import errors 6 | from mhn.api.models import Sensor 7 | from mhn.common.utils import error_response 8 | from mhn.auth import current_user 9 | from mhn.auth.models import ApiKey 10 | 11 | def deploy_auth(view): 12 | """ 13 | Authenticates the view, allowing access if user 14 | is authenticated or if posted deploy key is correct. 15 | """ 16 | @wraps(view) 17 | def wrapped_view(*args, **kwargs): 18 | if current_user and current_user.is_authenticated: 19 | return view(*args, **kwargs) 20 | elif 'deploy_key' in request.json: 21 | server_key = current_app.config['DEPLOY_KEY'] 22 | passed_key = request.json['deploy_key'] 23 | if server_key == passed_key: 24 | return view(*args, **kwargs) 25 | return error_response(errors.API_NOT_AUTHORIZED, 401) 26 | return wrapped_view 27 | 28 | 29 | def sensor_auth(view): 30 | """ 31 | Authenticates the view, allowing access if user 32 | is authenticated or if requesting from a sensor. 33 | """ 34 | @wraps(view) 35 | def wrapped_view(*args, **kwargs): 36 | if current_user and current_user.is_authenticated: 37 | return view(*args, **kwargs) 38 | elif request.authorization: 39 | auth = request.authorization 40 | if auth and auth.get('username') == auth.get('password') and\ 41 | Sensor.query.filter_by(uuid=auth.get('username')).count() == 1: 42 | return view(*args, **kwargs) 43 | return error_response(errors.API_NOT_AUTHORIZED, 401) 44 | return wrapped_view 45 | 46 | def token_auth(view): 47 | """ 48 | Authenticates the view, allowing access if user 49 | is authenticated or their API Key is correct 50 | """ 51 | @wraps(view) 52 | def wrapped_view(*args, **kwargs): 53 | if current_user and current_user.is_authenticated: 54 | return view(*args, **kwargs) 55 | 56 | api_key = request.args.get('api_key', '') 57 | if api_key: 58 | key = ApiKey.query.filter_by(api_key=api_key).first() 59 | if key: 60 | return view(*args, **kwargs) 61 | 62 | return error_response(errors.API_NOT_AUTHORIZED, 401) 63 | return wrapped_view 64 | -------------------------------------------------------------------------------- /server/mhn/api/errors.py: -------------------------------------------------------------------------------- 1 | API_FIELD_NOT_EDITABLE = '"{}" field is not editable.' 2 | API_FIELD_INVALID = '"{}" invalid field.' 3 | API_FIELDS_MISSING = 'Missing required fields: {}.' 4 | API_SENSOR_EXISTS = 'Sensor with name or hostname "{}" already exists.' 5 | API_SOURCE_EXISTS = 'Source with uri "{}" already exists.' 6 | API_NOT_AUTHORIZED = 'Not authorized to perform this request.' 7 | API_RESOURCE_NOT_FOUND = 'Requested resource was not found.' 8 | -------------------------------------------------------------------------------- /server/mhn/api/tests.py: -------------------------------------------------------------------------------- 1 | import json 2 | from uuid import uuid1 3 | 4 | from flask import url_for 5 | 6 | from mhn import db 7 | from mhn.common.testcommon import MHNTestCase 8 | from mhn.api.models import Sensor 9 | 10 | 11 | class SensorTestCase(MHNTestCase): 12 | 13 | def setUp(self): 14 | super(SensorTestCase, self).setUp() 15 | self.sensordata = dict(hostname='mhn.test.sensor', name='Test Sensor') 16 | self.deploykey = self.app.config['DEPLOY_KEY'] 17 | self.publish_dict = self.app.config['HONEYPOT_CHANNELS'] 18 | 19 | def test_create_sensor(self): 20 | create_url = url_for('api.create_sensor') 21 | data = self.sensordata.copy() 22 | data.update({'deploy_key': self.deploykey, 'honeypot': 'conpot'}) 23 | 24 | # Registering a sensor with deploy_key in post body. 25 | resp = self.client.post(create_url, data=json.dumps(data), 26 | content_type='application/json') 27 | resp = json.loads(resp.data) 28 | authkey = self.clio.authkey.get(identifier=resp['uuid']) 29 | sensor = Sensor.query.first() 30 | 31 | # Asserts correct authkey object was created on the database. 32 | self.assertEqual(authkey.identifier, sensor.uuid) 33 | self.assertEqual(authkey.publish, self.publish_dict[sensor.honeypot]) 34 | # Asserts sensor was creating with correct attributes. 35 | self.assertEqual(sensor.name, self.sensordata['name']) 36 | self.assertEqual(sensor.hostname, self.sensordata['hostname']) 37 | self.assertEqual(sensor.honeypot, data['honeypot']) 38 | 39 | def test_delete_sensor(self): 40 | data = self.sensordata.copy() 41 | data['honeypot'] = 'conpot' 42 | 43 | # Create sensor and respective authkey. 44 | sensor = Sensor(**data) 45 | sensor.uuid = str(uuid1()) 46 | self.clio.authkey.new(**sensor.new_auth_dict()).post() 47 | db.session.add(sensor) 48 | db.session.commit() 49 | 50 | # Objects before should equal 1. 51 | sensors_before = Sensor.query.count() 52 | keys_before = self.clio.authkey.count() 53 | 54 | # Logging in and making the DELETE request. 55 | self.login() 56 | delete_url = url_for('api.delete_sensor', uuid=sensor.uuid) 57 | self.client.delete(delete_url) 58 | 59 | # Sensors after should equal 0. 60 | sensors_after = Sensor.query.count() 61 | keys_after = self.clio.authkey.count() 62 | 63 | # Asserts that both sensor and authkey got deleted. 64 | self.assertEqual(sensors_before, sensors_after + 1) 65 | self.assertEqual(keys_before, keys_after + 1) 66 | -------------------------------------------------------------------------------- /server/mhn/auth/__init__.py: -------------------------------------------------------------------------------- 1 | from flask_security import login_required 2 | from flask_security.core import current_user 3 | from flask_security.decorators import roles_accepted 4 | 5 | 6 | def get_datastore(): 7 | from mhn import user_datastore 8 | return user_datastore 9 | -------------------------------------------------------------------------------- /server/mhn/auth/contextprocessors.py: -------------------------------------------------------------------------------- 1 | from mhn.auth import current_user 2 | 3 | 4 | def user_ctx(): 5 | """ 6 | Inserts current user templates context. 7 | """ 8 | return dict(user=current_user) 9 | -------------------------------------------------------------------------------- /server/mhn/auth/errors.py: -------------------------------------------------------------------------------- 1 | AUTH_INCORRECT_CREDENTIALS = 'Incorrect username or password.' 2 | AUTH_EMAIL_MISSING = 'Missing required "email" parameter.' 3 | AUTH_PSSWD_MISSING = 'Missing required "password" parameter.' 4 | AUTH_USERNAME_EXISTS = 'Selected username already exists.' 5 | AUTH_NOT_FOUND = 'User {} was not found.' 6 | AUTH_SMTP_ERROR = 'Error sending email.' 7 | AUTH_PASSWD_MATCH = 'Passwords do not match.' 8 | AUTH_RESET_HASH = 'Invalid password reset key.' 9 | AUTH_RESET_MISSING = 'Missing fields.' 10 | -------------------------------------------------------------------------------- /server/mhn/auth/models.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | 3 | from flask_security import UserMixin, RoleMixin 4 | from flask import render_template 5 | 6 | from mhn import db 7 | from mhn.api import APIModel 8 | 9 | 10 | roles_users = db.Table( 11 | 'roles_users', db.Column('user_id', db.Integer(), db.ForeignKey('user.id')), 12 | db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))) 13 | 14 | 15 | class Role(db.Model, RoleMixin): 16 | id = db.Column(db.Integer(), primary_key=True) 17 | name = db.Column(db.String(80), unique=True) 18 | description = db.Column(db.String(255)) 19 | 20 | 21 | class User(db.Model, APIModel, UserMixin): 22 | all_fields = { 23 | 'email': {'required': True, 'editable': False}, 24 | 'password': {'required': True, 'editable': True}, 25 | 'active': {'required': False, 'editable': True} 26 | } 27 | 28 | id = db.Column(db.Integer, primary_key=True) 29 | email = db.Column(db.String(255), unique=True) 30 | password = db.Column(db.String(255)) 31 | active = db.Column(db.Boolean()) 32 | confirmed_at = db.Column(db.DateTime()) 33 | roles = db.relationship('Role', secondary=roles_users, 34 | backref=db.backref('users', lazy='dynamic')) 35 | 36 | def to_dict(self): 37 | return dict( 38 | email=self.email, roles=[r.name for r in self.roles], 39 | active=self.active) 40 | 41 | 42 | class PasswdReset(db.Model): 43 | id = db.Column(db.Integer, primary_key=True) 44 | hashstr = db.Column(db.String(40)) 45 | created = db.Column(db.DateTime(), default=datetime.utcnow) 46 | active = db.Column(db.Boolean()) 47 | user_id = db.Column(db.Integer, db.ForeignKey(User.id)) 48 | user = db.relationship(User, uselist=False) 49 | 50 | @property 51 | def email_body(self): 52 | from mhn import mhn 53 | return render_template( 54 | 'auth/reset-email.html', hashstr=self.hashstr, 55 | server_url=mhn.config['SERVER_BASE_URL'], 56 | email=self.user.email) 57 | 58 | class ApiKey(db.Model): 59 | all_fields = { 60 | 'api_key': {'required': True, 'editable': False}, 61 | 'user_id': {'required': True, 'editable': False} 62 | } 63 | 64 | id = db.Column(db.Integer, primary_key=True) 65 | api_key = db.Column(db.String(32), unique=True) 66 | user_id = db.Column('user_id', db.Integer, db.ForeignKey("user.id"), nullable=False) 67 | -------------------------------------------------------------------------------- /server/mhn/common/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/common/__init__.py -------------------------------------------------------------------------------- /server/mhn/common/contextprocessors.py: -------------------------------------------------------------------------------- 1 | from flask import current_app 2 | 3 | 4 | def config_ctx(): 5 | """ 6 | Inserts some settings to be used in templates. 7 | """ 8 | settings = { 9 | 'server_url': current_app.config['SERVER_BASE_URL'], 10 | 'honeymap_url': current_app.config['HONEYMAP_URL'], 11 | 'deploy_key': current_app.config['DEPLOY_KEY'], 12 | 'supported_honeypots': current_app.config['HONEYPOT_CHANNELS'].keys() 13 | } 14 | return dict(settings=settings) 15 | -------------------------------------------------------------------------------- /server/mhn/common/ruleutils.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | 4 | def _parse_plain(r): 5 | """ 6 | Takes in a plain text rule and returns a dictionary 7 | object containing the parsed information. 8 | 9 | Adapted from: jasonish/idstools.py at GitHub. 10 | """ 11 | option_patterns = ( 12 | re.compile("(msg)\s*:\s*\"(.*?)\";"), 13 | re.compile("(sid)\s*:\s*(\d+);"), 14 | re.compile("(rev)\s*:\s*(\d+);"), 15 | re.compile("(reference)\s*:\s*(.*?);"), 16 | re.compile("(classtype)\s*:\s*(.*?);"), 17 | ) 18 | actions = ("alert", "log", "pass", "activate", 19 | "dynamic", "drop", "reject", "sdrop") 20 | rule_pattern = re.compile( 21 | r"^(?P#)*\s*" # Enabled/disabled 22 | r"(?P" 23 | r"(?P%s)\s*" # Action 24 | r"[^\s]*\s*" # Protocol 25 | r"[^\s]*\s*" # Source address(es) 26 | r"[^\s]*\s*" # Source port 27 | r"[-><]+\s*" # Direction 28 | r"[^\s]*\s*" # Destination address(es) 29 | r"[^\s]*\s*" # Destination port 30 | r"\((?P.*)\)\s*" # Options 31 | r")" 32 | % "|".join(actions)) 33 | rule = {} 34 | rule['references'] = [] 35 | # 'Escaping' brackets for safe string formatting. 36 | rule_format = r.replace('{', '{{').replace('}', '}}') 37 | for p in option_patterns: 38 | m = rule_pattern.match(r) 39 | options = m.group('options') 40 | for opt, val in p.findall(options): 41 | rplctext = '{}:{};' 42 | rplctoken = '{' + opt + '};' 43 | if opt != 'rev': 44 | # Rev is the last option and doesn't have a trailing have space. 45 | rplctext += ' ' 46 | rplctoken += ' ' 47 | if opt in ["gid", "sid", "rev"]: 48 | rule[opt] = int(val) 49 | elif opt == "reference": 50 | rule['references'].append(val) 51 | if len(rule['references']) > 1: 52 | rplctoken = '' 53 | elif opt == 'msg': 54 | rplctext = '{}:"{}"; ' 55 | rule[opt] = val 56 | else: 57 | rule[opt] = val 58 | rule_format = rule_format.replace( 59 | rplctext.format(opt, val), rplctoken) 60 | rule['rule_format'] = rule_format.strip() 61 | return rule 62 | 63 | 64 | def from_buffer(rbuffer): 65 | """ 66 | Takes in a buffer with rules in plain text and 67 | creates a list of parsed rules in dict objects. 68 | """ 69 | rules = [] 70 | rbuffer = rbuffer.decode(errors='ignore') 71 | for r in rbuffer.split('\n'): 72 | if not r.startswith('#') and r.strip(): 73 | rules.append(_parse_plain(r)) 74 | # A bit of cleanup 75 | rules = [ru for ru in rules if ru] 76 | return rules 77 | 78 | 79 | def from_file(rfile): 80 | """ 81 | Takes in an opened file object containig rules in plain text and 82 | creates a list of parsed rules in dict objects. 83 | """ 84 | rules = [] 85 | for r in rfile.readlines(): 86 | if not r.startswith('#') and r.strip(): 87 | rules.append(_parse_plain(r)) 88 | # A bit of cleanup 89 | rules = [ru for ru in rules if ru] 90 | return rules 91 | -------------------------------------------------------------------------------- /server/mhn/common/templatetags.py: -------------------------------------------------------------------------------- 1 | def format_date(dt): 2 | return dt.strftime('%Y-%m-%d %H:%M:%S') 3 | -------------------------------------------------------------------------------- /server/mhn/common/testcommon.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | 4 | from flask import url_for 5 | from flask.ext.testing import TestCase 6 | import pymongo 7 | 8 | import mhn.common.clio as clio 9 | from mhn import create_clean_db, mhn, db 10 | 11 | 12 | # Patching clio to use different database than production. 13 | clio_res = (clio.AuthKey, clio.ResourceMixin,) 14 | for res in clio_res: 15 | res.db_name = 'test_{}'.format(res.db_name) 16 | # End patching. 17 | 18 | 19 | class MHNTestCase(TestCase): 20 | 21 | def __init__(self, *args, **kwargs): 22 | super(MHNTestCase, self).__init__(*args, **kwargs) 23 | self.clio = clio.Clio() 24 | 25 | def create_app(self): 26 | _basedir = os.path.abspath(os.path.dirname(__file__)) 27 | db_uri = 'sqlite:///' + os.path.join(_basedir, 'test-mhn.db') 28 | mhn.config['SQLALCHEMY_DATABASE_URI'] = db_uri 29 | mhn.config['TESTING'] = True 30 | return mhn 31 | 32 | def setUp(self): 33 | create_clean_db() 34 | self.email = self.app.config['SUPERUSER_EMAIL'] 35 | self.passwd = self.app.config['SUPERUSER_PASSWORD'] 36 | 37 | def tearDown(self): 38 | db.session.remove() 39 | db.drop_all() 40 | 41 | # Removing test collections from mongo. 42 | cli = pymongo.MongoClient() 43 | for dbname in cli.database_names(): 44 | if dbname.startswith('test_'): 45 | cli.drop_database(dbname) 46 | 47 | def login(self, email=None, password=None): 48 | if email is None: 49 | email = self.email 50 | if password is None: 51 | password = self.passwd 52 | login_url = url_for('auth.login_user') 53 | logindata = json.dumps(dict(email=email, password=password)) 54 | self.client.post(login_url, data=logindata, content_type='application/json') 55 | -------------------------------------------------------------------------------- /server/mhn/common/utils.py: -------------------------------------------------------------------------------- 1 | from math import ceil 2 | 3 | from flask import jsonify, g 4 | 5 | from mhn.constants import PAGE_SIZE 6 | 7 | 8 | def error_response(message, status_code=400): 9 | resp = jsonify({'error': message}) 10 | resp.status_code = status_code 11 | return resp 12 | 13 | 14 | def alchemy_pages(query, **kwargs): 15 | page = kwargs.get('page', g.page) 16 | page_size = kwargs.get('limit', PAGE_SIZE) 17 | items = query.\ 18 | offset((page - 1) * page_size).\ 19 | limit(page_size) 20 | return Pagination(page, page_size, query.count(), items) 21 | 22 | 23 | def mongo_pages(result, total, **kwargs): 24 | page_size = kwargs.get('limit', PAGE_SIZE) 25 | return Pagination(g.page, page_size, total, result) 26 | 27 | 28 | def paginate_options(**kwargs): 29 | page = kwargs.get('page', g.page) 30 | page_size = kwargs.get('limit', PAGE_SIZE) 31 | return dict(skip=(page - 1) * page_size, limit=page_size) 32 | 33 | 34 | class Pagination(object): 35 | """ 36 | This Pagination class will work with both SQLAlchemy 37 | objects and Clio objects. 38 | Taken and stripped from Flask-SQLAlchemy""" 39 | 40 | def __init__(self, page, per_page, total, items): 41 | #: the current page number (1 indexed) 42 | self.page = page 43 | #: the number of items to be displayed on a page. 44 | self.per_page = per_page 45 | #: the total number of items matching the query 46 | self.total = total 47 | #: the items for the current page 48 | self.items = items 49 | 50 | @property 51 | def pages(self): 52 | """The total number of pages""" 53 | if self.per_page == 0: 54 | pages = 0 55 | else: 56 | pages = int(ceil(self.total / float(self.per_page))) 57 | return pages 58 | 59 | @property 60 | def prev_num(self): 61 | """Number of the previous page.""" 62 | return self.page - 1 63 | 64 | @property 65 | def has_prev(self): 66 | """True if a previous page exists""" 67 | return self.page > 1 68 | 69 | @property 70 | def has_next(self): 71 | """True if a next page exists.""" 72 | return self.page < self.pages 73 | 74 | @property 75 | def next_num(self): 76 | """Number of the next page""" 77 | return self.page + 1 78 | 79 | def iter_pages(self, left_edge=2, left_current=2, 80 | right_current=5, right_edge=2): 81 | last = 0 82 | for num in xrange(1, self.pages + 1): 83 | if num <= left_edge or \ 84 | (num > self.page - left_current - 1 and \ 85 | num < self.page + right_current) or \ 86 | num > self.pages - right_edge: 87 | if last + 1 != num: 88 | yield None 89 | yield num 90 | last = num 91 | -------------------------------------------------------------------------------- /server/mhn/constants.py: -------------------------------------------------------------------------------- 1 | PAGE_SIZE = 15 2 | -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/A1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/A1.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/A2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/A2.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/AD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/AD.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/AE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/AE.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/AF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/AF.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/AG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/AG.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/AI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/AI.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/AL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/AL.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/AM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/AM.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/AN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/AN.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/AO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/AO.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/AQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/AQ.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/AR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/AR.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/AS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/AS.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/AT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/AT.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/AU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/AU.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/AW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/AW.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/AX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/AX.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/AZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/AZ.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/BA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/BA.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/BB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/BB.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/BD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/BD.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/BE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/BE.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/BF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/BF.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/BG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/BG.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/BH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/BH.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/BI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/BI.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/BJ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/BJ.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/BL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/BL.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/BM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/BM.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/BN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/BN.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/BO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/BO.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/BR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/BR.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/BS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/BS.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/BT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/BT.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/BW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/BW.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/BY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/BY.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/BZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/BZ.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/CA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/CA.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/CC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/CC.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/CD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/CD.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/CF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/CF.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/CG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/CG.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/CH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/CH.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/CI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/CI.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/CK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/CK.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/CL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/CL.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/CM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/CM.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/CN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/CN.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/CO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/CO.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/CR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/CR.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/CU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/CU.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/CV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/CV.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/CW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/CW.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/CX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/CX.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/CY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/CY.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/CZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/CZ.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/DE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/DE.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/DJ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/DJ.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/DK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/DK.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/DM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/DM.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/DO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/DO.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/DZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/DZ.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/EC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/EC.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/EE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/EE.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/EG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/EG.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/EH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/EH.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/ER.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/ER.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/ES.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/ES.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/ET.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/ET.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/EU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/EU.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/FI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/FI.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/FJ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/FJ.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/FK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/FK.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/FM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/FM.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/FO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/FO.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/FR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/FR.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/GA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/GA.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/GB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/GB.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/GD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/GD.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/GE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/GE.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/GG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/GG.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/GH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/GH.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/GI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/GI.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/GL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/GL.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/GM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/GM.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/GN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/GN.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/GQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/GQ.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/GR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/GR.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/GS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/GS.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/GT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/GT.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/GU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/GU.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/GW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/GW.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/GY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/GY.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/HK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/HK.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/HN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/HN.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/HR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/HR.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/HT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/HT.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/HU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/HU.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/IC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/IC.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/ID.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/ID.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/IE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/IE.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/IL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/IL.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/IM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/IM.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/IN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/IN.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/IQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/IQ.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/IR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/IR.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/IS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/IS.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/IT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/IT.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/JE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/JE.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/JM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/JM.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/JO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/JO.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/JP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/JP.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/KE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/KE.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/KG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/KG.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/KH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/KH.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/KI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/KI.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/KM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/KM.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/KN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/KN.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/KP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/KP.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/KR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/KR.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/KW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/KW.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/KY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/KY.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/KZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/KZ.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/LA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/LA.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/LB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/LB.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/LC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/LC.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/LI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/LI.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/LK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/LK.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/LR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/LR.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/LS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/LS.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/LT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/LT.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/LU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/LU.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/LV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/LV.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/LY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/LY.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/MA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/MA.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/MC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/MC.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/MD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/MD.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/ME.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/ME.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/MF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/MF.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/MG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/MG.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/MH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/MH.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/MK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/MK.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/ML.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/ML.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/MM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/MM.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/MN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/MN.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/MO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/MO.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/MP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/MP.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/MQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/MQ.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/MR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/MR.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/MS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/MS.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/MT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/MT.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/MU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/MU.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/MV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/MV.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/MW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/MW.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/MX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/MX.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/MY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/MY.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/MZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/MZ.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/NA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/NA.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/NC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/NC.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/NE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/NE.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/NF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/NF.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/NG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/NG.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/NI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/NI.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/NL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/NL.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/NO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/NO.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/NP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/NP.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/NR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/NR.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/NU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/NU.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/NZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/NZ.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/O1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/O1.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/OM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/OM.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/PA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/PA.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/PE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/PE.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/PF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/PF.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/PG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/PG.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/PH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/PH.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/PK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/PK.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/PL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/PL.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/PN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/PN.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/PR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/PR.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/PS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/PS.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/PT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/PT.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/PW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/PW.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/PY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/PY.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/QA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/QA.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/RO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/RO.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/RS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/RS.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/RU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/RU.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/RW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/RW.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/SA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/SA.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/SB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/SB.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/SC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/SC.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/SD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/SD.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/SE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/SE.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/SG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/SG.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/SH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/SH.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/SI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/SI.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/SK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/SK.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/SL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/SL.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/SM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/SM.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/SN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/SN.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/SO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/SO.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/SR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/SR.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/SS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/SS.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/ST.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/ST.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/SV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/SV.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/SY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/SY.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/SZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/SZ.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/TC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/TC.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/TD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/TD.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/TF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/TF.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/TG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/TG.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/TH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/TH.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/TJ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/TJ.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/TK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/TK.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/TL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/TL.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/TM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/TM.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/TN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/TN.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/TO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/TO.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/TR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/TR.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/TT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/TT.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/TV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/TV.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/TW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/TW.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/TZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/TZ.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/UA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/UA.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/UG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/UG.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/US.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/US.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/UY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/UY.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/UZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/UZ.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/VA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/VA.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/VC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/VC.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/VE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/VE.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/VG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/VG.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/VI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/VI.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/VN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/VN.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/VU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/VU.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/WF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/WF.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/WS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/WS.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/YE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/YE.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/YT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/YT.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/ZA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/ZA.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/ZM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/ZM.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/ZW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/ZW.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/_abkhazia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/_abkhazia.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/_basque-country.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/_basque-country.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/_british-antarctic-territory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/_british-antarctic-territory.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/_commonwealth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/_commonwealth.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/_england.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/_england.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/_gosquared.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/_gosquared.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/_kosovo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/_kosovo.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/_mars.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/_mars.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/_nagorno-karabakh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/_nagorno-karabakh.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/_nato.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/_nato.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/_northern-cyprus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/_northern-cyprus.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/_olympics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/_olympics.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/_red-cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/_red-cross.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/_scotland.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/_scotland.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/_somaliland.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/_somaliland.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/_south-ossetia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/_south-ossetia.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/_united-nations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/_united-nations.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/_unknown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/_unknown.png -------------------------------------------------------------------------------- /server/mhn/static/img/flags-iso/shiny/64/_wales.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/flags-iso/shiny/64/_wales.png -------------------------------------------------------------------------------- /server/mhn/static/img/trash-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/trash-24.png -------------------------------------------------------------------------------- /server/mhn/static/img/tslogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/tslogo.png -------------------------------------------------------------------------------- /server/mhn/static/img/unknown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/static/img/unknown.png -------------------------------------------------------------------------------- /server/mhn/static/registration.txt: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ $# -ne 3 ] 4 | then 5 | echo "Wrong number of arguments supplied." 6 | echo "Usage: sh $0 ." 7 | exit 1 8 | fi 9 | 10 | server_url=$1 11 | deploy_key=$2 12 | honeypot=$3 13 | hostname=$(hostname) 14 | 15 | if [ -f /etc/debian_version ]; then 16 | OS=Debian # XXX or Ubuntu?? 17 | sudo apt-get install -y curl python 18 | 19 | elif [ -f /etc/redhat-release ]; then 20 | OS=RHEL 21 | sudo yum -y install curl 22 | 23 | else 24 | echo -e "ERROR: Unknown OS\nExiting!" 25 | exit -1 26 | fi 27 | 28 | 29 | curl -s -X POST -H "Content-Type: application/json" -d "{ 30 | \"name\": \"${hostname}-${honeypot}\", 31 | \"hostname\": \"$hostname\", 32 | \"deploy_key\": \"$deploy_key\", 33 | \"honeypot\": \"$honeypot\" 34 | }" $server_url/api/sensor/ > /tmp/deploy.json 35 | 36 | uuid=$(python -c 'import json;obj=json.load(file("/tmp/deploy.json"));print obj["uuid"]') 37 | 38 | if [ -z "$uuid" ] 39 | then 40 | echo "Could not create sensor using name \"$hostname\"." 41 | exit 1 42 | fi 43 | 44 | set -e 45 | 46 | echo "Created sensor: " $uuid 47 | 48 | ###################################################### 49 | # hpfeeds info 50 | export HPF_HOST=$(echo $server_url | sed 's#^http://##; s#^https://##; s#/.*$##; s/:.*$//') 51 | export HPF_PORT="10000" 52 | export HPF_IDENT=$(python -c 'import json;obj=json.load(file("/tmp/deploy.json"));print obj["identifier"]') 53 | export HPF_SECRET=$(python -c 'import json;obj=json.load(file("/tmp/deploy.json"));print obj["secret"]') 54 | ###################################################### 55 | -------------------------------------------------------------------------------- /server/mhn/tasks/__init__.py: -------------------------------------------------------------------------------- 1 | from celery import Celery 2 | 3 | from mhn import mhn 4 | 5 | 6 | celery = Celery(include=['mhn.tasks.rules']) 7 | celery.conf.update(mhn.config) 8 | TaskBase = celery.Task 9 | class ContextTask(TaskBase): 10 | abstract = True 11 | def __call__(self, *args, **kwargs): 12 | with mhn.app_context(): 13 | return TaskBase.__call__(self, *args, **kwargs) 14 | celery.Task = ContextTask 15 | -------------------------------------------------------------------------------- /server/mhn/tasks/rules.py: -------------------------------------------------------------------------------- 1 | import os 2 | import tarfile 3 | from datetime import datetime 4 | try: 5 | from StringIO import cStringIO as StringIO 6 | except ImportError: 7 | from StringIO import StringIO 8 | 9 | from flask import current_app as app 10 | import requests 11 | 12 | from mhn.tasks import celery 13 | from mhn.api.models import Rule, RuleSource 14 | from mhn.common.ruleutils import from_buffer 15 | 16 | 17 | @celery.task 18 | def render_rules(): 19 | app.logger.info('Rendering rules.') 20 | from flask import current_app 21 | sbuffer = Rule.renderall() 22 | fpath = current_app.config['RENDERED_RULES_PATH'] 23 | with open(fpath, 'w') as rfile: 24 | rfile.write(sbuffer) 25 | app.logger.info('Finished rendering rules.') 26 | 27 | 28 | @celery.task 29 | def fetch_sources(): 30 | app.logger.info('Fetching sources from {} sources.'.format( 31 | RuleSource.query.count())) 32 | rules = [] 33 | for src in RuleSource.query: 34 | # Download rules from every source. 35 | app.logger.info('Downloading from "{}".'.format(src.uri)) 36 | # If a gzip file, perform a streamed download 37 | # and save it to a temp file. 38 | stream = src.uri.endswith('gz') 39 | resp = requests.get(src.uri, stream=stream) 40 | if resp.status_code == 200: 41 | if stream: 42 | tmpdir = '/tmp/{}-{}/'.format(src.name, 43 | datetime.utcnow().isoformat()) 44 | os.mkdir(tmpdir) 45 | ziprules = StringIO() 46 | for chunk in resp.iter_content(): 47 | ziprules.write(chunk) 48 | ziprules.seek(0) 49 | try: 50 | zrules = tarfile.open(fileobj=ziprules, mode='r:gz') 51 | except tarfile.TarError as terr: 52 | app.logger.warning( 53 | 'Error in rule file: {}\n{}'.format(src.uri, str(terr))) 54 | else: 55 | ruleslist = [] 56 | for member in zrules.getmembers(): 57 | if member.name.endswith('.rules') and member.isfile(): 58 | # Keep track of extracted filenames. 59 | ruleslist.append(member.name) 60 | zrules.extract(member, path=tmpdir) 61 | # All rule files found are now extracted into tmpdir. 62 | for rname in ruleslist: 63 | try: 64 | rulepath = os.path.join(tmpdir, rname) 65 | with open(rulepath, 'rb') as rfile: 66 | rules.extend(from_buffer(rfile.read())) 67 | os.remove(rulepath) 68 | except Exception as e: 69 | app.logger.exception("Unhandled exception: {}. Continuing".format(e)) 70 | continue 71 | 72 | # A subdirectory /rules/ is created when extracting, 73 | # removing that first then the whole tmpdir. 74 | os.rmdir(os.path.join(tmpdir, 'rules')) 75 | os.rmdir(tmpdir) 76 | else: 77 | # rules will contain all parsed rules. 78 | rules.extend(from_buffer(resp.text)) 79 | else: 80 | pass 81 | app.logger.info('Bulk importing {} rules.'.format(len(rules))) 82 | Rule.bulk_import(rules) 83 | render_rules() 84 | -------------------------------------------------------------------------------- /server/mhn/templates/auth/reset-email.html: -------------------------------------------------------------------------------- 1 |
2 | MHN Server 3 |
4 |
5 | MHN Server has received a password reset request for {{ email }}. To change password visit: {{ server_url }}{{ url_for('ui.forgot_passwd', hashstr=hashstr) }}. 6 | -------------------------------------------------------------------------------- /server/mhn/templates/pagination.html: -------------------------------------------------------------------------------- 1 | {% macro render_pagination(items, view, args) %} 2 | {% if items.pages > 1 %} 3 |
4 |
    5 | {% if items.page > 1 %} 6 | {% set _ = args.update({'page': items.page - 1}) %} 7 |
  • «
  • 8 | {% endif %} 9 | {% for page in items.iter_pages() %} 10 | {% if not page %} 11 |
  • 12 | {% else %} 13 | {% set _ = args.update({'page': page}) %} 14 |
  • 15 | {{ page }} 16 |
  • 17 | {% endif %} 18 | {% endfor %} 19 | {% if items.pages > items.page %} 20 | {% set _ = args.update({'page': items.page + 1}) %} 21 |
  • »
  • 22 | {% endif %} 23 |
24 |
25 | {% endif %} 26 | {% endmacro %} 27 | -------------------------------------------------------------------------------- /server/mhn/templates/security/login_user.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {% block title %}Login{% endblock %} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | {% block content %} 13 |
14 |
15 |

Welcome to the Modern Honeypot Network Server

16 |
17 |
18 |
19 | 20 |
21 | Log In 22 | 23 | 24 | 25 | 26 |
27 |
28 | 31 |
32 |
33 |
34 | Forgot password? 35 |
36 |
37 |
38 | 39 |
40 |
41 |
42 |
43 |
44 |
45 | 53 | 59 | {% endblock %} 60 | 61 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /server/mhn/templates/ui/add-sensor.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block title %}Sensors{% endblock %} 3 | {% block content %} 4 |
5 |
6 |

Add a Sensor

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 | 43 |
44 | 52 | {% endblock %} 53 | -------------------------------------------------------------------------------- /server/mhn/templates/ui/chart.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block content %} 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 | {% endblock %} 31 | -------------------------------------------------------------------------------- /server/mhn/templates/ui/feeds.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block title %}Payloads{% endblock %} 3 | {% block content %} 4 |
5 |
6 |

Payloads Report

7 |
8 |
9 |
10 |
11 |
12 |
13 |

Search Filters

14 |
15 |
16 |
17 |
18 |
19 | 20 |
21 |
22 | 23 |
24 |
25 |
26 |
27 | 32 |
33 |
34 | 35 |
36 |
37 | 38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 | 46 | 47 | 48 | {% for h in columns%} 49 | 50 | {% endfor %} 51 | 52 | 53 | 54 | {% for feed in feeds.items %} 55 | 56 | {% for field in columns %} 57 | 58 | {% endfor %} 59 | 60 | {% endfor %} 61 | 62 |
{{ h }}
{{ feed[field] }}
63 | {% from "pagination.html" import render_pagination %} 64 | {{ render_pagination(feeds, view, request.args.to_dict()) }} 65 |
66 |
67 | {% endblock %} 68 | -------------------------------------------------------------------------------- /server/mhn/templates/ui/honeymap.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block title %}Map{% endblock %} 3 | {% block content %} 4 | 8 | {% endblock %} 9 | -------------------------------------------------------------------------------- /server/mhn/templates/ui/reset-password.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block title %}Change Password{% endblock %} 3 | {% block content %} 4 |
5 |
6 |

Change Password

7 |
8 |
9 |
10 | 11 | 12 |
13 |
14 | 15 |
16 |
17 |
18 |
19 | 20 |
21 |
22 |
23 |
24 | 25 |
26 |
27 | 28 | 35 |
36 |
37 | 38 |
39 |
40 |
41 | {% endblock %} 42 | -------------------------------------------------------------------------------- /server/mhn/templates/ui/reset-request.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block title %}Change Password{% endblock %} 3 | {% block content %} 4 |
5 |
6 |

Change Password

7 |
8 |
9 |
10 | 11 |
12 |
13 | 17 |
18 |
19 | 26 |
27 |
28 | 29 |
30 |
31 |
32 | {% endblock %} 33 | -------------------------------------------------------------------------------- /server/mhn/templates/ui/rule_sources_mgmt.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block title %}Rule Sources{% endblock %} 3 | {% block content %} 4 |
5 |
6 |

Rule Sources

7 |
8 |
9 | {% for src in sources %} 10 |
11 |
12 |
    13 |
  • {{ src.name }}
  • 14 |
  • {{ src.uri }}
  • 15 | {% if src.note %} 16 |
  • Comment: {{ src.note }}
  • 17 | {% endif %} 18 |
  • 19 |
20 |
21 |
22 | {% endfor %} 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 | 50 |
51 |
52 | 53 |
54 |
55 |
56 | {% endblock %} 57 | -------------------------------------------------------------------------------- /server/mhn/templates/ui/sensors.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block title %}Sensors{% endblock %} 3 | {% block content %} 4 |
5 |
6 |

Sensors

7 |
8 |
9 |
10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | {% for sr in sensors.items %} 25 | 26 | 27 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | {% endfor %} 43 | 44 |
NameHostnameIPHoneypotUUIDAttacks
{{ pag.skip + loop.index }}- 28 | 29 | 35 | {{ sr.hostname }}{{ sr.ip}}{{ sr.honeypot}}{{ sr.uuid}}{{ sr.attacks_count }}
45 | {% from "pagination.html" import render_pagination %} 46 | {{ render_pagination(sensors, view, request.args.to_dict()) }} 47 |
48 |
49 | {% endblock %} 50 | -------------------------------------------------------------------------------- /server/mhn/ui/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwnlandia/mhn/2fa4f7727ad6bf1a7b7cb440f5cfc8320099362c/server/mhn/ui/__init__.py -------------------------------------------------------------------------------- /server/mhn/ui/constants.py: -------------------------------------------------------------------------------- 1 | DEFAULT_FLAG_URL = '/static/img/unknown.png' 2 | -------------------------------------------------------------------------------- /server/mhn/ui/utils.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from flask import current_app as app 3 | from mhn.ui import constants 4 | from config import MHN_SERVER_HOME 5 | import os 6 | from werkzeug.contrib.cache import SimpleCache 7 | import socket 8 | import struct 9 | from mhn.api.models import Sensor 10 | import geoip2.database 11 | 12 | flag_cache = SimpleCache(threshold=1000, default_timeout=300) 13 | sensor_cache = SimpleCache(threshold=1000, default_timeout=300) 14 | 15 | geoip2_reader = geoip2.database.Reader(MHN_SERVER_HOME+'/../../GeoLite2-City.mmdb') 16 | 17 | def is_RFC1918_addr(ip): 18 | # 10.0.0.0 = 167772160 19 | # 172.16.0.0 = 2886729728 20 | # 192.168.0.0 = 3232235520 21 | RFC1918_net_bits = ((167772160, 8), (2886729728, 12), (3232235520, 16)) 22 | 23 | try: 24 | # ip to decimal 25 | ip = struct.unpack("!L", socket.inet_aton(ip))[0] 26 | 27 | for net, mask_bits in RFC1918_net_bits: 28 | ip_masked = ip & (2 ** 32 - 1 << (32 - mask_bits)) 29 | if ip_masked == net: 30 | return True 31 | except Exception as e: 32 | print 'Error ({}) on is_RFC1918_addr: {}'.format(e, ip) 33 | 34 | return False 35 | 36 | def get_flag_ip(ipaddr): 37 | if is_RFC1918_addr(ipaddr): 38 | return constants.DEFAULT_FLAG_URL 39 | 40 | flag = flag_cache.get(ipaddr) 41 | if not flag: 42 | flag = _get_flag_ip_localdb(ipaddr) 43 | flag_cache.set(ipaddr, flag) 44 | return flag 45 | 46 | def get_sensor_name(sensor_id): 47 | sensor_name = sensor_cache.get(sensor_id) 48 | if not sensor_name: 49 | for s in Sensor.query: 50 | if s.uuid == sensor_id: 51 | sensor_name = s.hostname 52 | sensor_cache.set(sensor_id, sensor_name) 53 | break 54 | print 'Name: %s' % sensor_name 55 | return sensor_name 56 | 57 | def _get_flag_ip_localdb(ipaddr): 58 | flag_path = '/static/img/flags-iso/shiny/64/{}.png' 59 | try: 60 | r = geoip2_reader.city(ipaddr) 61 | ccode = r.country.iso_code 62 | except Exception: 63 | app.logger.warning("Could not determine flag for ip (LOCALDB): {}".format(ipaddr)) 64 | return constants.DEFAULT_FLAG_URL 65 | else: 66 | # Constructs the flag source using country code 67 | flag = flag_path.format(ccode.upper()) 68 | if os.path.exists(MHN_SERVER_HOME +"/mhn"+flag): 69 | return flag 70 | else: 71 | return constants.DEFAULT_FLAG_URL 72 | 73 | def _get_flag_ip(ipaddr): 74 | """ 75 | Returns an static address where the flag is located. 76 | Defaults to static immge: '/static/img/unknown.png' 77 | """ 78 | flag_path = '/static/img/flags-iso/shiny/64/{}.png' 79 | geo_api = 'https://geospray.threatstream.com/ip/{}' 80 | try: 81 | # Using threatstream's geospray API to get 82 | # the country code for this IP address. 83 | r = requests.get(geo_api.format(ipaddr)) 84 | ccode = r.json()['countryCode'] 85 | except Exception: 86 | app.logger.warning("Could not determine flag for ip: {}".format(ipaddr)) 87 | return constants.DEFAULT_FLAG_URL 88 | else: 89 | # Constructs the flag source using country code 90 | flag = flag_path.format(ccode.upper()) 91 | if os.path.exists(MHN_SERVER_HOME +"/mhn"+flag): 92 | return flag 93 | else: 94 | return constants.DEFAULT_FLAG_URL 95 | -------------------------------------------------------------------------------- /server/migration_remove-hostname-and-name-uniq-constraints.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE sensors2 ( 2 | id INTEGER NOT NULL, 3 | uuid VARCHAR(36), 4 | name VARCHAR(50), 5 | created_date DATETIME, 6 | ip VARCHAR(15), 7 | hostname VARCHAR(50), 8 | identifier VARCHAR(50), 9 | honeypot VARCHAR(50), 10 | PRIMARY KEY (id), 11 | UNIQUE (uuid), 12 | UNIQUE (identifier) 13 | ); 14 | 15 | INSERT INTO sensors2 (id, uuid, name, created_date, ip, hostname, identifier, honeypot) 16 | SELECT id, uuid, name, created_date, ip, hostname, identifier, honeypot FROM sensors; 17 | ALTER TABLE sensors RENAME TO sensors_backup; 18 | ALTER TABLE sensors2 RENAME TO sensors; 19 | -------------------------------------------------------------------------------- /server/requirements.txt: -------------------------------------------------------------------------------- 1 | Werkzeug==0.16.1 2 | argparse==1.2.1 3 | Flask==0.12.4 4 | Flask-Login==0.3.2 5 | Flask-Mail==0.9.1 6 | Flask-Migrate==1.8.1 7 | Flask-SQLAlchemy==2.5.1 8 | Flask-Security==1.7.5 9 | Flask-Testing==0.7.1 10 | Flask-WTF==0.14.2 11 | bcrypt==3.1.4 12 | python-dateutil==2.2 13 | celery==4.3.0 14 | redis==3.2.1 15 | requests==2.21.0 16 | xmltodict==0.12.0 17 | uWSGI==2.0.18 18 | pymongo==3.7.2 19 | hpfeeds-threatstream==1.1 20 | pygal==2.4.0 21 | hpfeeds-logger==0.0.7.7 22 | geoip2==2.9.0 23 | pysqlite>=2.8.0 24 | email_validator==1.0.5 25 | -------------------------------------------------------------------------------- /vagrant-bootstrap.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | /vagrant/install.sh 4 | --------------------------------------------------------------------------------