Use a proxy with Waydroid

Waydroid is a project that allows you to run Android applications on a Linux distribution. It’s a fork of the project Anbox-Android-in-a-Box. Android applications are run in a container and do not have the overhead of emulators.

This article will explain how to use a proxy with Waydroid and intercept the traffic using a proxy. This can be useful to reverse engineer an API or for security testing.

Install Waydroid on Ubuntu

First, you need to install Waydroid on your Ubuntu distribution. You can follow the instructions on the official website.

Here is a quick summary:

$ sudo apt install curl ca-certificates -y # Install curl and ca-certificates
$ curl https://repo.waydro.id | sudo bash # Add the repository 
$ sudo apt install waydroid adb -y # Install Waydroid package and Android Debug Bridge
$ sudo systemctl enable --now waydroid-container # Start the service

BE CAREFUL: Waydroid require Wayland.

At this point, you should be able to launch Waydroid from the application menu. You will be prompted to download the Android image with or without the Google applications. Once the download is complete, you will be able to launch Android applications.

If the newtork doesn’t work you can use https://github.com/waydroid/waydroid/issues/143

sudo sed -i~ -E 's/=.\$\(command -v (nft|ip6?tables-legacy).*/=/g' \
     /usr/lib/waydroid/data/scripts/waydroid-net.sh

Install a Proxy

We are going to use Mitmproxy as a proxy. You can install it with the following command:

$ sudo apt install mitmproxy -y

Mitmproxy will be used to intercept the traffic between the Android application and the Internet. It’s an Open Source project that allows you to inspect and modify HTTP traffic. It’s also easy to script with Python.

Mitmproxy can be used as a command-line tool or with a web interface. We are going to use the web interface.

You can start Mitmproxy with the following command:

$ mitmweb -p 8888

This will start Mitmproxy on port 8888 and launch the web interface. You can access the web interface by opening the following URL in your browser: http://127.0.0.1:8081

Test with curl

You can test the proxy with Curl. You need to set the proxy with the following command:

$ export http_proxy=http://127.0.0.1:8888

Next, you can test the proxy with the following command:

$ curl http://example.com

You should see the request in the Mitmproxy web interface.

If you try to proxy HTTPS traffic, you will get a certificate error.

$ export https_proxy="http://127.0.0.1:8888"
$ curl https://example.com

You can ignore the certificate error with the following command:

$ curl --insecure https://example.com

To make it work in Waydroid you will need to install the certificate in the Android image.

The certificate is located in the following directory: ~/.mitmproxy/

Setup the proxy in Waydroid

First you need to get the IP address of your computer on the container network. You can get it with the following command:

$ ip address show waydroid0
18: waydroid0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:16:3e:00:00:01 brd ff:ff:ff:ff:ff:ff
    inet 192.168.240.1/24 brd 192.168.240.255 scope global waydroid0
       valid_lft forever preferred_lft forever
    inet6 fe80::216:3eff:fe00:1/64 scope link
       valid_lft forever preferred_lft forever

Here the IP is 192.168.240.1

We restart Mitmproxy with the following command:

$ mitmweb -p 8888 --listen-host 192.168.240.1

Then you can configure the proxy in Waydroid with the following command:

$ adb shell settings put global http_proxy "172.17.0.1:8888"

You can now test in the browser a non HTTPS page.

Install the certificate in Waydroid

All credit goes to this GitHub issue.

First you need the certificate hash.

This is the first line of the output of the following command:

$ openssl x509 -subject_hash_old -in ~/.mitmproxy/mitmproxy-ca-cert.pem
a8990c1d

Next we create an overlay directory in Waydroid:

$ sudo mkdir -p /var/lib/waydroid/overlay/system/etc/security/cacerts/

-p is used to create the parent directories if they don’t exist.

And we copy the certificate in the overlay directory:

$ sudo cp ~/.mitmproxy/mitmproxy-ca-cert.pem /var/lib/waydroid/overlay/system/etc/security/cacerts/a8990c1d.0
$ sudo chmod 644 /var/lib/waydroid/overlay/system/etc/security/cacerts/a8990c1d.0

Pay attention to the extension of the certificate. It must be .0 and the file name must be the hash of the certificate.

Remove the proxy

adb shell settings put global http_proxy :0

Oreille

A small week end project: Oreille is a wrapper on OpenAPI Whisper API. It provides support for long audio files.

OpenAPI Whisper support only files that are less than 25 MB. Oreille will break the audio file into chunks of 25 MB’s or less. https://platform.openai.com/docs/guides/speech-to-text/longer-inputs

Oreille will also compute the correct timing of the subtitle when merging the output of Whisper. So once you export the subtitle the timestamp of the subtitle will be right.

You can open and save WAV files with pure python. For opening and saving non-wav files – like mp3 – you’ll need ffmpeg or libav.

View project on Github

How an HTTP/HTTPS proxy work

The goal of this article is to explain how a minimal HTTP/HTTPS proxy work.

HTTP

For an HTTP proxy the communication is simple the client etablish a TCP connection to the proxy and send the HTTP request. The proxy will parse the HTTP request and forward it to the server. The server will reply with the HTTP response and the proxy will forward it to the client.

The main difference is the method will be followed by the full URL of the target server.

GET http://www.example.org/index HTTP/1.1
Host: example.org:443

HTTPS

When the client open the connection to the proxy he will send the CONNECT HTTP method followed by the host and port of the target server.

It’s a classic HTTP request with headers. The proxy will stop to parse once it has read the double CRLF.

CONNECT example.org:443 HTTP/1.1
Host: example.org:443

The proxy will reply with the status 200:

HTTP/1.1 200 OK

Now we have a bidirectional tunnel between the client and the server. The proxy in the middle will just forward the data and is not going to be able to read it.

The client will now send the TLS handshake to the server and the server will reply with the TLS handshake. Once it’s done the communication is etablished and the client can send the HTTP request to the server.

JSONApiDoc

JSON Api Doc une petite bibliothèque Open Source que j’ai publiée.

En manipulant des API en JSON API une chose m’a beaucoup gêné. L’utilisation des included pour éviter de dupliquer les données rend la lecture très difficile par un humain.

Cette bibliothèque utilisable dans un programme Python ou en cli permet tout simplement de résoudre les included et de renvoyer un objet plus simple à lire et à manipuler par un humain.

Par exemple:

{
  "data": [{
    "type": "articles",
    "id": "1",
    "attributes": {
      "title": "JSON API paints my bikeshed!",
      "body": "The shortest article. Ever.",
      "created": "2015-05-22T14:56:29.000Z",
      "updated": "2015-05-22T14:56:28.000Z"
    },
    "relationships": {
      "author": {
        "data": {"id": "42", "type": "people"}
      }
    }
  }],
  "included": [
    {
      "type": "people",
      "id": "42",
      "attributes": {
        "name": "John",
        "age": 80,
        "gender": "male"
      }
    }
  ]
}

Donnera:

[
    {
        "type": "articles",
        "id": "1",
        "title": "JSON API paints my bikeshed!",
        "body": "The shortest article. Ever.",
        "created": "2015-05-22T14:56:29.000Z",
        "updated": "2015-05-22T14:56:28.000Z",
        "author": {
            "type": "people",
            "id": "42",
            "name": "John",
            "age": 80,
            "gender": "male"
        }
    }
]

Le code est disponible sur GitHub

Detect Python code duplicate

You can detect Python code duplicate with Pylint

pylint --disable=all --enable=duplicate-code src/

No config file found, using default configuration
************* Module gns3server.compute.dynamips.nodes.ethernet_switch
R:  1, 0: Similar lines in 2 files
==gns3server.compute.dynamips.nodes.ethernet_hub:101
==gns3server.compute.dynamips.nodes.ethernet_switch:136
    @property
    def mappings(self):
        """
        Returns port mappings

        :returns: mappings list
        """

        return self._mappings

    @asyncio.coroutine
    def delete(self):
        return (yield from self.close())

    @asyncio.coroutine
    def close(self):
        """
        Deletes this hub.
        """
 (duplicate-code)
R:  1, 0: Similar lines in 2 files
==gns3server.compute.dynamips.nodes.ethernet_hub:66
==gns3server.compute.dynamips.nodes.ethernet_switch:72
    @property
    def ports_mapping(self):
        """
        Ports on this hub

        :returns: ports info
        """

        return self._ports

    @ports_mapping.setter
    def ports_mapping(self, ports):
        """
        Set the ports on this hub

        :param ports: ports info
        """
        if ports != self._ports: (duplicate-code)

Report
======
231 statements analysed.

Statistics by type
------------------

+---------+-------+-----------+-----------+------------+---------+
|type     |number |old number |difference |%documented |%badname |
+=========+=======+===========+===========+============+=========+
|module   |2      |NC         |NC         |NC          |NC       |
+---------+-------+-----------+-----------+------------+---------+
|class    |2      |NC         |NC         |NC          |NC       |
+---------+-------+-----------+-----------+------------+---------+
|method   |0      |NC         |NC         |0           |0        |
+---------+-------+-----------+-----------+------------+---------+
|function |0      |NC         |NC         |0           |0        |
+---------+-------+-----------+-----------+------------+---------+



Raw metrics
-----------

+----------+-------+------+---------+-----------+
|type      |number |%     |previous |difference |
+==========+=======+======+=========+===========+
|code      |304    |48.95 |NC       |NC         |
+----------+-------+------+---------+-----------+
|docstring |167    |26.89 |NC       |NC         |
+----------+-------+------+---------+-----------+
|comment   |34     |5.48  |NC       |NC         |
+----------+-------+------+---------+-----------+
|empty     |116    |18.68 |NC       |NC         |
+----------+-------+------+---------+-----------+



Duplication
-----------

+-------------------------+-------+---------+-----------+
|                         |now    |previous |difference |
+=========================+=======+=========+===========+
|nb duplicated lines      |87     |NC       |NC         |
+-------------------------+-------+---------+-----------+
|percent duplicated lines |14.100 |NC       |NC         |
+-------------------------+-------+---------+-----------+



Messages by category
--------------------

+-----------+-------+---------+-----------+
|type       |number |previous |difference |
+===========+=======+=========+===========+
|convention |0      |NC       |NC         |
+-----------+-------+---------+-----------+
|refactor   |7      |NC       |NC         |
+-----------+-------+---------+-----------+
|warning    |0      |NC       |NC         |
+-----------+-------+---------+-----------+
|error      |0      |NC       |NC         |
+-----------+-------+---------+-----------+



% errors / warnings by module
-----------------------------

+--------------------------------------------------+------+--------+---------+-----------+
|module                                            |error |warning |refactor |convention |
+==================================================+======+========+=========+===========+
|gns3server.compute.dynamips.nodes.ethernet_switch |0.00  |0.00    |100.00   |0.00       |
+--------------------------------------------------+------+--------+---------+-----------+



Messages
--------

+---------------+------------+
|message id     |occurrences |
+===============+============+
|duplicate-code |7           |
+---------------+------------+



Global evaluation
-----------------
Your code has been rated at 9.70/10

Un système d'exploitation souverain mais pourquoi?

La discussion sur le système d’exploitation souverain est devenue une blague sur internet tellement cette proposition parait absurde. Mais ce qui n’était au début qu’un amendement a était adopté par les députés. La blague pourrait au final coûter au citoyen. Même si elle part probablement d’un bon sentiment.

C’est quoi un système d’exploitation?

Le système d’exploitation c’est grosso modo la couche logicielle entre le matériel et vos applications. C’est donc indispensable et incontournable. Les systèmes les plus connus sont Windows, MacOSX, Linux pour les PC de bureau et IOS et Android pour les téléphones portables.

On veut changer quoi?

L’amendement adopté au parlement:

Le Gouvernement remet au Parlement,dans les trois mois suivant la promulgation de la présente loi, un rapport sur la possibilité de créer un Commissariat à la souveraineté numérique rattaché aux services du Premier ministre dont les missions concourront à l’exercice, dans le cyberespace, de la souveraineté nationale et des droits et libertés individuels et collectifs que la République protège. Ce rapport précise les conditions de mise en place, sous l’égide de ce Commissariat, d’un système d’exploitation souverain et de protocoles de chiffrement des données, ainsi que les moyens et l’organisation nécessaires au fonctionnement de cet établissement public. ».

Mais le début de l’exposé sommaire nous renseigne plus:

La guerre contre le terrorisme, mais aussi l’urgente nécessité de protéger dans le cyberespace les droits et libertés des citoyens alors qu’une récente décision de la Cour de Justice de l’Union Européenne a prouvé que leurs données à caractère personnel étaient exploitées en toute illégalité, appellent de la part de la représentation nationale une prise de conscience nouvelle sur les enjeux liés à l’exercice de la souveraineté de la France dans le domaine du numérique.

On a ici deux choses:

  • La guerre contre le terrorisme
  • Les données à caractère personnel

Le détail complet est ici: http://www.assemblee-nationale.fr/14/amendements/3318/CION_LOIS/CL129.asp

La guerre contre le terrorisme

C’est le premier point de l’exposé sommaire. Puisqu’à priori Google, Apple ou Microsoft ne sont pas des entreprises terroristes quel risque court-on? Et bien il se trouve que ces sociétés aient tendance à trop bien protéger nos données avec des systèmes ou seul l’utilisateur à accès. Et que même si un ingénieur de Apple voulait lire le contenu chiffré de votre téléphone il ne pourrait pas. On pourrait donc voir cette tentative de système souverain comme une volonté d’accéder à nos données par l’État.

Pour être efficace, il faudrait donc que les terroristes acceptent de remplacer leurs ordinateurs par des versions françaises. Autant dire que cela n’arrivera pas. D’autant plus qu’ils disposent déjà de logiciels leur permettant de chiffrer les communications sans faire confiance au chiffrement mis en place par Apple, Google ou Microsoft.

Et quant à l’imposer, cela reviendrait à un désastre économique qui isolerait la France du reste du monde numérique. Imaginez vous être obligé d’acheter un téléphone français fait uniquement pour le marché français. Et le cauchemar pour les entreprises obligées d’utiliser un système différent en fonction du pays.

Les données à caractère personnel

Un certain nombre de ces systèmes sont fermés et pourrait contenir des portes dérobées pour le gouvernement américain. Par ailleurs, les entreprises qui les exploitent peuvent utiliser ces données sans l’accord des personnes.

Mais ce n’est pas le cas de Linux ou d’Android si l’on prend un dérivé. En effet le logiciel libre nous permet d’auditer le code source. On a donc déjà des solutions que l’on pourrait promouvoir.

Et les données personnelles doivent être protégées par la loi, quelle que soit la couche concernée. Il serait absurde que l’on empêche Google d’accéder aux données de votre téléphone via le système, mais que de toute façon il lise vos emails via Gmail. Cela passe donc par des lois et non des solutions techniques. D’ailleurs la loi discutée à l’Assemblée renforce très fortement les pouvoirs de sanction de la CNIL.

Qui fait cela?

Peu de pays ont essayé. L’exemple le plus connu est celui de la Corée du Nord avec Red Star OS: https://fr.wikipedia.org/wiki/Red_Star_OS

Pourquoi il ne faut pas essayer?

Après tout quel mal il y aurait a essayer de faire un système pour les gens qui veulent et nos administrations?

C’est un gouffre financier. La précédente tentative de cloud souverain s’est soldée par 150 millions d’euros d’argent public gaspillé. Et c’est sans compter le tort causé aux sociétés françaises qui était déjà sur ce marché.

Tout ce qui reste c’est cette publicité:

Le numérique en plus n’a pas besoin de grand projet pour créer de l’emploi, financer un projet ne participe pas à la relance de l’économie.

http://www.lesechos.fr/idees-debats/editos-analyses/0204173981400-cloud-souverain-un-gachis-a-la-francaise-1096130.php

Si le projet démarre de zéro Numerama à estimé le coût à 1 milliard d’euros. Ce qui me parait sous-estimé compte tenu de la complexité de l’opération.

http://www.numerama.com/business/139709-developper-un-os-souverain-combien-cela-coute.html

Même si à priori la volonté serait de se baser sur un Linux. Mais quel intérêt face à l’existant ?

Certains diront que pour le moment on engage peu de dépense vu que ce n’est qu’un rapport. Mais cela aura déjà un coût pour la société et le rapport pourrait déboucher sur un nouveau fiasco.

Mais alors on peut faire quoi?

A ma modeste échelle j’ai trois propositions.

Tout d’abord, on priorise le logiciel libre qui est une solution déjà existante et peu couteuse économiquement. Et l’on a la capacité de les auditer pour vérifier qu’il n’existe pas de portes dérobées au profit des USA.

Cela passe d’abord par l’administration, en effet comment parler de souveraineté quand l’éducation nationale signe des accords avec Microsoft pour utiliser ses services de clouds. http://www.education.gouv.fr/cid96030/numerique-a-l-ecole-partenariat-entre-le-ministere-de-l-education-nationale-et-microsoft.html

Ou l’assemblée nationale qui utilise Microsoft Exchange pour ses emails: http://www2.assemblee-nationale.fr/decouvrir-l-assemblee/role-et-pouvoirs-de-l-assemblee-nationale/l-administration-de-l-assemblee-nationale/l-informatique-a-l-assemblee-nationale

Mais cela l’assemblée l’a refusé malgré le fait que c’était la proposition la plus soutenue lors de la consultation publique. https://www.april.org/les-debats-ne-font-que-commencer-autour-de-la-priorite-au-logiciel-libre-dans-la-loi

Deuxièment la CNIL doit sanctionner ceux qui viole la vie privée et là-dessus la loi république numérique va dans le bon sens en augmentant le pouvoir de sanction de la CNIL.

Troisièment, on mène des actions d’abus de position dominante au niveau européen pour que les géants ne puissent plus imposer arbitrairement leurs règles. Le système des stores pose notamment des problèmes de libre concurrence.

Mais pourquoi perdre du temps à écrire là dessus?

Lors de la création du cloud souverain, on a rigolé, mais au final c’est passé et 150 millions d’euros se sont évaporés et les copains des dirigeants qui se sont enrichis. On doit être méfiant pour éviter un nouveau Cloud Watt.

Pour continuer

L’excellent article de monsieur Bortzmeyer http://www.bortzmeyer.org/os-souverain.html