[HN Gopher] Show HN: Mitmproxy2swagger - Automagically reverse-e...
       ___________________________________________________________________
        
       Show HN: Mitmproxy2swagger - Automagically reverse-engineer REST
       APIs
        
       Author : alufers
       Score  : 404 points
       Date   : 2022-05-12 13:49 UTC (9 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | jwong_ wrote:
       | Really neat! Gives me an idea on using something like this to
       | generate e.g., CURL commands to mimic SSO flows.
       | 
       | Even just documenting an SSO flow as a diagram would be quite
       | neat.
        
         | john-tells-all wrote:
         | Note that for single resources, Chrome/Edge can do this now.
         | There's a semi-hidden "copy this resource as Curl" option:
         | 
         | https://everything.curl.dev/usingcurl/copyas#:~:text=From%20...
         | .
         | 
         | When it works, it's effing magic! Spectacular for very quickly
         | knocking out Bash scripts that test multiple APIs.
        
       | a-dub wrote:
       | lol!
       | 
       | step 2: features for training a language model on the request and
       | response variables in the mitm stream and a shim for standing up
       | a fully ml data driven zero code mock backend.
        
       | ducktective wrote:
       | Is it possible to do this on wireshark/tcpdump pcap dumps? Like
       | for finding out hostnames, endpoints and request packets of HTTPS
       | requests that an android app is making?
        
         | alufers wrote:
         | The problem with pcap is that whe requests there would be
         | encrypted and basically there is no way to practically decrypt
         | them.
         | 
         | Mitmproxy solves that by being between the client and server
         | and injecting it's own self-signed certificate (which you need
         | to add to the trusted certificates on the phone, which requires
         | root).
        
           | resoluteteeth wrote:
           | See SSLKEYLOGFILE
        
       | mro_name wrote:
       | awesome take
        
       | dnnssl2 wrote:
       | Starred. Does this work with non-emulated iOS or Android http
       | calls in which you may need to disable app level security?
        
         | jeroenhd wrote:
         | For Android you'll probably need root access (unless the app
         | developer has opted in to loading your user-imported
         | certificate authorities). For iOS this should be easier.
         | 
         | However, many apps apply cert pinning in production builds,
         | which will require tools like Frida to disable them, which in
         | turn requires root access/a jailbreak to function.
         | 
         | Alternatively, you could pull the apps from your phone without
         | root (at least on Android), patch the most obvious cert pinning
         | out (usually in the network manifest file) and install the new
         | version.
        
       | Sytten wrote:
       | Super nice! We might integrate something similar in Caido proxy.
        
       | aleksiy123 wrote:
       | Really awesome, I tried my hand at writing something similar and
       | was surprised at how well it actually ended up working.
       | 
       | I feel liken the next step is automatically generating load tests
       | and/or fuzzing tests. Felt like that could be a real product.
        
       | Labo333 wrote:
       | Very nice!
       | 
       | On the same note, I wrote a program to generate Python code
       | (requests) from a HAR capture:
       | https://github.com/louisabraham/har2requests
       | 
       | I think using HAR captures is simpler for the end user than
       | spawning mitmproxy as they don't require any installation and are
       | extracted from the network tab of the browser devtools. Is there
       | a reason why you didn't use them?
       | 
       | EDIT: I realized that mitmproxy can also get traffic from other
       | devices like phones. Very cool project, I will think about
       | modifying mine to support mitmproxy captures!
        
       | klyr wrote:
       | Hi, I would also like to add another tool I'm contributing to at
       | work (cisco) called APIClarity [1]. It aims at reconstructing
       | swagger specifications of REST microservices running in K8S, but
       | can also be run locally.
       | 
       | This is a challenging task and we don't support OpenAPI v3 specs
       | yet (we are working on it).
       | 
       | Feel free to have a look, and get ideas from it :)
       | 
       | We'll also be presenting it at next Kubecon 2022.
       | 
       | [1]: https://github.com/openclarity/apiclarity
        
       | SemanticStrengh wrote:
       | Can this be used to generate a REST documentation for your own
       | frontend just by interacting with it? This should be augmented
       | via a crawler, that click everyclickable element recursively.
        
         | alufers wrote:
         | Totally, but you would need to do some manual cleanup and
         | naming afterwards to make it more useful than just reading the
         | source code. You could also for example use your integration
         | tests if you have some to capture as much routes as possible.
        
           | SemanticStrengh wrote:
           | of course the generated doc should be refined (e.g. filling
           | missing types, error codes) but your lib would save us a lot
           | of work and make the world a better place.
        
             | tomatowurst wrote:
             | _"...and we expect it to be free and open source as our
             | budget for this is zero. "_
        
               | SemanticStrengh wrote:
               | The relationship between actual utility/value and price
               | is only vaguely correlated. Many of the most useful
               | things on earth can't be marketed, not because they're
               | not worth the money but because people are extremely
               | greedy for some kinds of domains and simultaneously are
               | bad at realizing the impact on their lives. E.g I have
               | never spent a single dollar to access music despite being
               | one of the few things in life that brings me intense joy
        
       | useful wrote:
       | bravo, I've wanted something like this
        
       | Divyeshkharade wrote:
       | This looks amazing. Will it also capture data types like
       | enumerators by someway detecting patters?
        
         | alufers wrote:
         | I thought about it, but it would be hard to distinguish between
         | an enumerator and just static data. For example if you logged
         | in with only one account it could classify the "username" field
         | as an enumeration, because there is only one captured value.
        
           | freedomben wrote:
           | Yeah I imagine that is nearly impossible without capturing
           | data at scale. Awesome tool! I'm super grateful :-)
        
       | alufers wrote:
       | Wanted to show off my little project which helps whith reverse
       | engneering APIs used by various apps. It takes HTTP traffic
       | capturewd by mitmproxy and generates an OpenAPI specification for
       | a given REST API.
       | 
       | I have used it already on two apps and the results are good
       | enough to write an alternative client or quickly automate some
       | stuff.
        
         | upupandup wrote:
         | does it capture route/server rendered pages too?
        
           | alufers wrote:
           | It does, but it will only generate schema descriptions for
           | JSON endpoints. Whis means that the URL and method will
           | appear in the spec, but not the response/request schema.
        
         | mhils wrote:
         | mitmproxy dev here, very awesome! :) This seems to be
         | particularly useful to quickly generate clients for reverse-
         | engineered APIs.
        
           | mohsen1 wrote:
           | Swagger Editor dev which now works at Airbnb here. This is
           | hilarious!
        
             | SOLAR_FIELDS wrote:
             | Hilarious indeed! The first thing I thought of with this
             | project is actually AirBnB, because the sort/filter/map
             | view is so terrible and missing features. AirBnB captures
             | data on a bunch of stuff, but doesn't make it possible to
             | search for in the UI (ever want a property with a lake view
             | or a sauna? AirBnB knows which ones have those things, but
             | they won't let you look for them!)
             | 
             | AirBnB doesn't have an official API but changes the tags so
             | often that scrapers people put up on Github go out of date
             | quickly. Now I can run this whenever I want to have actual
             | search functionality (instead of the hobbled crap available
             | on the website) and ensure that whatever flavor of API is
             | available on the website that day is easily queryable!
        
         | lancebeet wrote:
         | This is a really clever project. It seems like an obvious idea
         | once you've seen it, but it clearly isn't. Thank you for
         | sharing it.
        
       | captn3m0 wrote:
       | Almost exactly a fit against my idea[1] to generate OpenAPI from
       | HAR files. Going to read through to see if I can add HAR support.
       | 
       | [1]: https://github.com/captn3m0/ideas#openapi-specification-
       | gene...
        
         | efitz wrote:
         | OpenAPI is just the latest version of swagger. Should not be
         | hard to change.
         | 
         | I was able to translate HAR to OpenAPI with this web site's
         | free preview: https://www.apimatic.io/transformer/
         | 
         | I also see others are working on the same thing:
         | https://github.com/dcarr178/har2openapi
        
           | kaidon wrote:
           | Also https://github.com/anbuksv/avantation
        
       | instagary wrote:
       | How did you bypass cert pinning in the video for the Airbnb app?
        
         | alufers wrote:
         | I didn't, just added a self-signed cert to my keychain on macOS
         | and launched the app as downloaded from App Store.
         | 
         | I guess Airbnb doesn't use cert pinning.
        
         | paxys wrote:
         | It doesn't have anything to do with mobile. The web client uses
         | the same APIs.
        
       | BWStearns wrote:
       | This is fantastic!
        
       | efitz wrote:
       | This is awesome; I'm going to try it as soon as I get back to my
       | desk. I've been working on trying to glue together tools to
       | translate Charles proxy output to OpenAPI (swagger). I think it
       | would be a great tool to have in a web app reverse engineering
       | toolbox.
        
       | eligro91 wrote:
       | Really amazing.
       | 
       | We're having hundreds of undocumented endpoints created over the
       | years, and running this tool on our backends will create
       | instantly good documentation
       | 
       | Thanks for that! Will give feedbacks if any issues
        
       | Cilvic wrote:
       | The question is maybe a bit off-topic a d vague. That's because I
       | struggle to express it with the right terms:
       | 
       | I'm looking for a generic tool to build and then serve:
       | 
       | Accept Incoming request (API contract A) Send outgoing request
       | (API contract B) potentially with parameters from the incoming
       | request Receiving incoming response (API contract B) Do some
       | translations/string manipulation Send outgoing response (API
       | contract A)
        
         | jeroenhd wrote:
         | mitmproxy (https://mitmproxy.org/) has scripting support that
         | will let you do most of this.
         | 
         | For example, you can expose mitmproxy, listen to HTTP requests
         | for a specific host (using this API:
         | https://docs.mitmproxy.org/stable/api/mitmproxy/http.html),
         | intercept the request, do whatever API calls you need, and
         | inject a response without ever forwarding the request to the
         | original server.
         | 
         | Alternatively, you could modify the request and then change the
         | request destination, like in this example here:
         | https://docs.mitmproxy.org/stable/addons-examples/#http-
         | redi.... Using the WSGI support, you could even use normal
         | Python annotations to build your own API without doing too much
         | pattern matching: https://docs.mitmproxy.org/stable/addons-
         | examples/#wsgi-flas...
        
       | chrisweekly wrote:
       | Awesome idea! Thank you for creating and sharing!
        
       | andrewstuart2 wrote:
       | I've always wanted to build something similar to this, by reading
       | HAR files captured right out of the devtools. Have you given any
       | thought to that as an alternative input?
        
       | dudus wrote:
       | This is a great idea. Kudos.
        
       | jeroenhd wrote:
       | Very interesting! Would this also be able to determine what kind
       | of auth (header tokens, cookies, etc) the APIs require or is that
       | something you still need to detect manually?
        
         | alufers wrote:
         | At this point yes, but I am working on adding this.
        
       | oneweekwonder wrote:
       | little bit off-topic, but do anybody know of something similar
       | for soap/wsdl? I'm aware of soapui mock service.
        
         | alufers wrote:
         | Doesn't wsdl just expose the schema on the server?
        
           | efitz wrote:
           | WSDL and OpenAPI/Swagger solve similar problems.
           | 
           | Roughly speaking: WSDL is to XML web services as OpenAPI is
           | to REST
           | 
           | They both model the API and message structure of an API.
           | AFAICT WSDL goes a little farther in that you can declare
           | message sequences (I might be giving short shrift to OpenAPI
           | here).
        
             | flatiron wrote:
             | Short of "this requires oauth" I think you are right about
             | openapi
        
       | upupandup wrote:
       | this is absolutely insane!!! I understand capturing the REST api
       | network part, is it then examining the request body, headers
       | being sent back and forth to figure out the API?
        
         | alufers wrote:
         | Yes, this is basically what this program does.
        
       | nickysielicki wrote:
       | This is really incredible. With a rooted android phone and these
       | tools, plus a couple others [1,2,3], you can get a skeleton to
       | implement a backend for any app you want.
       | 
       | [1]: https://github.com/koxudaxi/fastapi-code-generator
       | 
       | [2]: https://github.com/ioxiocom/openapi-to-fastapi
       | 
       | [3]: https://infosecwriteups.com/hail-frida-the-universal-ssl-
       | pin...
        
         | [deleted]
        
         | andreidd wrote:
         | That's interesting, but it won't work with native code that
         | statically links a SSL implementation.
        
           | jeroenhd wrote:
           | In many applications you can bypass built-in verifications
           | with some Frida [1] code. It requires more effort to do so,
           | of course, as you'd need to find the OpenSSL methods (with a
           | script like this [2] and bypass the verification in there.
           | 
           | If you're really intent on getting it to work, downloading
           | the binary, patching out the verification function and
           | putting it back is also possible if you're root.
           | 
           | [1]: https://frida.re/docs/android/
           | 
           | [2]: https://mobsecguys.medium.com/exploring-native-
           | functions-wit...
        
       ___________________________________________________________________
       (page generated 2022-05-12 23:00 UTC)